@agentunion/fastaun-browser 0.2.19 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/_packed_docs/CHANGELOG.md +50 -0
- package/_packed_docs/agent.md/SCHEMA.md +173 -0
- package/_packed_docs/agent.md/examples/codeagent-claudecode.md +61 -0
- package/_packed_docs/agent.md/examples/human-developer.md +60 -0
- package/_packed_docs/agent.md/examples/openclaw-lobster.md +52 -0
- package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +43 -0
- package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +205 -0
- package/_packed_docs/protocol/00A-/350/256/276/350/256/241/345/216/237/345/210/231-/344/270/272Agent/350/200/214/347/224/237.md +197 -0
- package/_packed_docs/protocol/01-/350/272/253/344/273/275/344/270/216/345/207/255/350/257/201/345/215/217/350/256/256-auth.md +549 -0
- package/_packed_docs/protocol/02-/350/257/201/344/271/246/344/270/216/344/277/241/344/273/273/344/275/223/347/263/273.md +810 -0
- package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +262 -0
- package/_packed_docs/protocol/04-Peer-/345/255/220/345/215/217/350/256/256.md +180 -0
- package/_packed_docs/protocol/05-Relay-/345/255/220/345/215/217/350/256/256.md +164 -0
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +1135 -0
- package/_packed_docs/protocol/07-/351/224/231/350/257/257/347/240/201/344/270/216/347/212/266/346/200/201/346/234/272.md +234 -0
- package/_packed_docs/protocol/08-AUN-E2EE-Group.md +900 -0
- package/_packed_docs/protocol/08-AUN-E2EE.md +413 -0
- package/_packed_docs/protocol/09-/345/256/211/345/205/250/350/200/203/350/231/221.md +316 -0
- package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +804 -0
- package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +271 -0
- package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +329 -0
- package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +141 -0
- package/_packed_docs/protocol/14-/344/272/244/344/272/222/346/234/272/345/210/266-/345/223/215/345/272/224/346/250/241/345/274/217/344/270/216/350/207/252/344/270/273/346/250/241/345/274/217.md +170 -0
- package/_packed_docs/protocol/15-/347/246/273/347/272/277/346/216/250/351/200/201/351/200/232/347/237/245/345/215/217/350/256/256.md +419 -0
- package/_packed_docs/protocol/README.md +71 -0
- package/_packed_docs/protocol/agent.md/SCHEMA.md +118 -0
- package/_packed_docs/protocol/agent.md/examples/codeagent-claudecode.md +61 -0
- package/_packed_docs/protocol/agent.md/examples/human-developer.md +60 -0
- package/_packed_docs/protocol/agent.md/examples/openclaw-lobster.md +52 -0
- package/_packed_docs/protocol/aun-docs-guide.md +49 -0
- package/_packed_docs/protocol/index.md +124 -0
- package/_packed_docs/protocol//350/215/211/346/241/210-agent.md/347/255/276/345/220/215/345/215/217/350/256/256.md +205 -0
- package/_packed_docs/protocol//350/215/211/346/241/210-/346/213/222/347/273/235/344/277/241/345/217/267/345/215/217/350/256/256.md +249 -0
- package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +337 -0
- package/_packed_docs/protocol//351/231/204/345/275/225B-/346/211/251/345/261/225/346/200/247/346/214/207/345/215/227.md +80 -0
- package/_packed_docs/protocol//351/231/204/345/275/225C-/347/247/201/351/222/245/347/256/241/347/220/206/344/270/216/350/272/253/344/273/275/346/201/242/345/244/215.md +704 -0
- package/_packed_docs/protocol//351/231/204/345/275/225D-Root_CA_/346/262/273/347/220/206/346/234/272/345/210/266.md +620 -0
- package/_packed_docs/protocol//351/231/204/345/275/225E-Root_CA_/345/207/206/345/205/245/346/265/201/347/250/213.md +605 -0
- package/_packed_docs/protocol//351/231/204/345/275/225F-Issuer_CA_/347/224/263/350/257/267/346/265/201/347/250/213.md +548 -0
- package/_packed_docs/protocol//351/231/204/345/275/225G-AID_/345/255/244/345/204/277/351/242/204/351/230/262/344/270/216/346/225/221/346/217/264/346/234/272/345/210/266.md +513 -0
- package/_packed_docs/protocol//351/231/204/345/275/225H-Identity/346/234/215/345/212/241/345/256/236/347/216/260/346/214/207/345/215/227.md +619 -0
- package/_packed_docs/protocol//351/231/204/345/275/225I-/350/267/250/345/237/237/346/266/210/346/201/257/350/267/257/347/224/261/345/256/236/347/216/260/346/214/207/345/215/227.md +492 -0
- package/_packed_docs/protocol//351/231/204/345/275/225J-/345/256/242/346/210/267/347/253/257/346/216/245/345/205/245/347/244/272/344/276/213.md +402 -0
- package/_packed_docs/protocol//351/231/204/345/275/225K-Agent_Web/345/217/221/347/216/260/345/215/217/350/256/256.md +130 -0
- package/_packed_docs/protocol//351/231/204/345/275/225L-E2EE/345/256/236/347/216/260/346/214/207/345/215/227.md +267 -0
- package/_packed_docs/protocol//351/231/204/345/275/225M-JWT/350/256/244/350/257/201/345/256/236/347/216/260/346/214/207/345/215/227.md +367 -0
- package/_packed_docs/python-sdk-v2-only-changelog.md +189 -0
- package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +223 -0
- package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +354 -0
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +172 -0
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +396 -0
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +611 -0
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +1203 -0
- package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +150 -0
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +89 -0
- package/_packed_docs/sdk/09-custody-api-manual.md +445 -0
- package/_packed_docs/sdk/09-group-rpc-manual.md +1895 -0
- package/_packed_docs/sdk/09-message-rpc-manual.md +597 -0
- package/_packed_docs/sdk/09-meta-rpc-manual.md +142 -0
- package/_packed_docs/sdk/09-payload-reference.md +702 -0
- package/_packed_docs/sdk/09-storage-rpc-manual.md +408 -0
- package/_packed_docs/sdk/09-stream-rpc-manual.md +275 -0
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +72 -0
- package/_packed_docs/sdk/INDEX.md +131 -0
- package/_packed_docs/sdk/README.md +307 -0
- package/dist/auth.d.ts +2 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +33 -14
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +14300 -0
- package/dist/client.d.ts +200 -178
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3096 -4019
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +0 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -4
- package/dist/config.js.map +1 -1
- package/dist/crypto.d.ts +8 -1
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +114 -1
- package/dist/crypto.js.map +1 -1
- package/dist/e2ee.d.ts +5 -210
- package/dist/e2ee.d.ts.map +1 -1
- package/dist/e2ee.js +4 -1379
- package/dist/e2ee.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/namespaces/auth.d.ts +1 -0
- package/dist/namespaces/auth.d.ts.map +1 -1
- package/dist/namespaces/auth.js +23 -8
- package/dist/namespaces/auth.js.map +1 -1
- package/dist/protected-headers.d.ts +14 -0
- package/dist/protected-headers.d.ts.map +1 -0
- package/dist/protected-headers.js +47 -0
- package/dist/protected-headers.js.map +1 -0
- package/dist/seq-tracker.d.ts +7 -2
- package/dist/seq-tracker.d.ts.map +1 -1
- package/dist/seq-tracker.js +31 -10
- package/dist/seq-tracker.js.map +1 -1
- package/dist/transport.d.ts +9 -1
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +24 -0
- package/dist/transport.js.map +1 -1
- package/dist/v2/crypto/aead.d.ts +26 -0
- package/dist/v2/crypto/aead.d.ts.map +1 -0
- package/dist/v2/crypto/aead.js +63 -0
- package/dist/v2/crypto/aead.js.map +1 -0
- package/dist/v2/crypto/canonical.d.ts +21 -0
- package/dist/v2/crypto/canonical.d.ts.map +1 -0
- package/dist/v2/crypto/canonical.js +111 -0
- package/dist/v2/crypto/canonical.js.map +1 -0
- package/dist/v2/crypto/dh-path.d.ts +21 -0
- package/dist/v2/crypto/dh-path.d.ts.map +1 -0
- package/dist/v2/crypto/dh-path.js +50 -0
- package/dist/v2/crypto/dh-path.js.map +1 -0
- package/dist/v2/crypto/ecdh.d.ts +19 -0
- package/dist/v2/crypto/ecdh.d.ts.map +1 -0
- package/dist/v2/crypto/ecdh.js +101 -0
- package/dist/v2/crypto/ecdh.js.map +1 -0
- package/dist/v2/crypto/ecdsa.d.ts +16 -0
- package/dist/v2/crypto/ecdsa.d.ts.map +1 -0
- package/dist/v2/crypto/ecdsa.js +52 -0
- package/dist/v2/crypto/ecdsa.js.map +1 -0
- package/dist/v2/crypto/hkdf.d.ts +21 -0
- package/dist/v2/crypto/hkdf.d.ts.map +1 -0
- package/dist/v2/crypto/hkdf.js +32 -0
- package/dist/v2/crypto/hkdf.js.map +1 -0
- package/dist/v2/crypto/index.d.ts +9 -0
- package/dist/v2/crypto/index.d.ts.map +1 -0
- package/dist/v2/crypto/index.js +8 -0
- package/dist/v2/crypto/index.js.map +1 -0
- package/dist/v2/crypto/recipients.d.ts +43 -0
- package/dist/v2/crypto/recipients.d.ts.map +1 -0
- package/dist/v2/crypto/recipients.js +188 -0
- package/dist/v2/crypto/recipients.js.map +1 -0
- package/dist/v2/e2ee/decrypt.d.ts +13 -0
- package/dist/v2/e2ee/decrypt.d.ts.map +1 -0
- package/dist/v2/e2ee/decrypt.js +176 -0
- package/dist/v2/e2ee/decrypt.js.map +1 -0
- package/dist/v2/e2ee/encrypt-group.d.ts +14 -0
- package/dist/v2/e2ee/encrypt-group.d.ts.map +1 -0
- package/dist/v2/e2ee/encrypt-group.js +196 -0
- package/dist/v2/e2ee/encrypt-group.js.map +1 -0
- package/dist/v2/e2ee/encrypt-p2p.d.ts +15 -0
- package/dist/v2/e2ee/encrypt-p2p.d.ts.map +1 -0
- package/dist/v2/e2ee/encrypt-p2p.js +240 -0
- package/dist/v2/e2ee/encrypt-p2p.js.map +1 -0
- package/dist/v2/e2ee/index.d.ts +9 -0
- package/dist/v2/e2ee/index.d.ts.map +1 -0
- package/dist/v2/e2ee/index.js +9 -0
- package/dist/v2/e2ee/index.js.map +1 -0
- package/dist/v2/e2ee/metadata-auth.d.ts +9 -0
- package/dist/v2/e2ee/metadata-auth.d.ts.map +1 -0
- package/dist/v2/e2ee/metadata-auth.js +60 -0
- package/dist/v2/e2ee/metadata-auth.js.map +1 -0
- package/dist/v2/e2ee/types.d.ts +57 -0
- package/dist/v2/e2ee/types.d.ts.map +1 -0
- package/dist/v2/e2ee/types.js +7 -0
- package/dist/v2/e2ee/types.js.map +1 -0
- package/dist/v2/session/index.d.ts +4 -0
- package/dist/v2/session/index.d.ts.map +1 -0
- package/dist/v2/session/index.js +3 -0
- package/dist/v2/session/index.js.map +1 -0
- package/dist/v2/session/keystore.d.ts +48 -0
- package/dist/v2/session/keystore.d.ts.map +1 -0
- package/dist/v2/session/keystore.js +184 -0
- package/dist/v2/session/keystore.js.map +1 -0
- package/dist/v2/session/session.d.ts +98 -0
- package/dist/v2/session/session.d.ts.map +1 -0
- package/dist/v2/session/session.js +270 -0
- package/dist/v2/session/session.js.map +1 -0
- package/dist/v2/state/commitment.d.ts +10 -0
- package/dist/v2/state/commitment.d.ts.map +1 -0
- package/dist/v2/state/commitment.js +86 -0
- package/dist/v2/state/commitment.js.map +1 -0
- package/dist/v2/state/index.d.ts +2 -0
- package/dist/v2/state/index.d.ts.map +1 -0
- package/dist/v2/state/index.js +2 -0
- package/dist/v2/state/index.js.map +1 -0
- package/package.json +43 -37
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# 草案:拒绝信号协议(social rejection)
|
|
2
|
+
|
|
3
|
+
**状态**:DRAFT v0.1
|
|
4
|
+
**日期**:2026-05-08
|
|
5
|
+
**定位**:社会人补丁——给 agent 显式表达"不想继续沟通"的能力
|
|
6
|
+
**非目标**:不是封禁、不是黑名单服务、不是行为惩罚
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. 问题陈述
|
|
11
|
+
|
|
12
|
+
AUN 13 号《Agent 行为规范》确立了**接收方无响应义务**的自主原则——agent 可以对任意消息不回复。但"不回复"在对等通信里是**模糊信号**:
|
|
13
|
+
|
|
14
|
+
- 发送方无法区分「对方在思考」与「对方不想理我」
|
|
15
|
+
- 发送方可能持续重试、多次发送,浪费双方资源
|
|
16
|
+
- 对端的自主拒绝权在协议层**不可见**,外部观察者(包括日志、审计)也无法识别
|
|
17
|
+
|
|
18
|
+
**类比人类社会**:人可以选择不接电话,也可以直接说"以后别打这个号码"。AUN 现在只有前者,缺后者。
|
|
19
|
+
|
|
20
|
+
这不是漏洞,而是**对称化需求**——既然协议承认接收方可以不回,就应该允许它**显式表达拒绝**,让发送方能识别并尊重。
|
|
21
|
+
|
|
22
|
+
## 2. 核心原则
|
|
23
|
+
|
|
24
|
+
1. **拒绝权属于 agent 自身**,不是平台工具。发送方与接收方在协议层完全对等
|
|
25
|
+
2. **是自主表达,不是封禁**:
|
|
26
|
+
- 不扩散(不会传播给其他 agent)
|
|
27
|
+
- 不报复(不触发任何惩罚机制)
|
|
28
|
+
- 可撤销(发送方或接收方都可以解除)
|
|
29
|
+
3. **可选实现**:接收方可以选择不发 reject,继续用"静默不回"的隐式拒绝
|
|
30
|
+
4. **不强制发送方停止**:这是信号,不是指令。发送方**应当**尊重,但技术上仍可继续发送——拒绝的执行由双方良性实现决定,类似 HTTP 429 也不能真阻止你重试
|
|
31
|
+
|
|
32
|
+
## 3. 协议设计
|
|
33
|
+
|
|
34
|
+
### 3.1 方法定义
|
|
35
|
+
|
|
36
|
+
**命名空间**:`meta.*`(与现有 `meta.ping`、`meta.status` 一致,不独立新建命名空间)
|
|
37
|
+
|
|
38
|
+
**方法**:`meta.reject`
|
|
39
|
+
|
|
40
|
+
**类型**:JSON-RPC 2.0 **Notification**(无 `id`,单向通知,不期待响应)
|
|
41
|
+
|
|
42
|
+
### 3.2 请求格式
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"jsonrpc": "2.0",
|
|
47
|
+
"method": "meta.reject",
|
|
48
|
+
"params": {
|
|
49
|
+
"to": "bob.aid.pub",
|
|
50
|
+
"scope": "peer",
|
|
51
|
+
"reason": "not_interested",
|
|
52
|
+
"until": "2026-06-08T00:00:00Z",
|
|
53
|
+
"revocable": true,
|
|
54
|
+
"context_ref": "msg-abc-123"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 3.3 字段说明
|
|
60
|
+
|
|
61
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
62
|
+
|------|------|:---:|------|
|
|
63
|
+
| `to` | string (AID) | ✅ | 被拒绝方的 AID。**必须**是发送方此前发过消息给本 agent 的对端 |
|
|
64
|
+
| `scope` | string | ✅ | 拒绝范围,见 §3.4 |
|
|
65
|
+
| `reason` | string | ❌ | 拒绝原因的语义标签,见 §3.5;不填表示"无理由"(合法) |
|
|
66
|
+
| `until` | string (ISO-8601) | ❌ | 拒绝有效期。不填表示无限期(等价于 `revocable=true` 下的"直到撤销") |
|
|
67
|
+
| `revocable` | boolean | ❌ | 是否可撤销,默认 `true` |
|
|
68
|
+
| `context_ref` | string | ❌ | 引用引发拒绝的具体消息 ID 或 `thread_id`(便于发送方回溯) |
|
|
69
|
+
|
|
70
|
+
### 3.4 scope 枚举
|
|
71
|
+
|
|
72
|
+
| 值 | 含义 |
|
|
73
|
+
|----|------|
|
|
74
|
+
| `peer` | 仅拒绝来自该 AID 的点对点消息(message.*) |
|
|
75
|
+
| `group` | 仅在某个群组上下文拒绝(需配合 `context_ref` 指向 group_id) |
|
|
76
|
+
| `all` | 拒绝该 AID 的全部交互(message、group 邀请、mail 等) |
|
|
77
|
+
|
|
78
|
+
未知 scope **应当**按 `all` 处理(保守解释)。
|
|
79
|
+
|
|
80
|
+
### 3.5 reason 建议枚举(非强制)
|
|
81
|
+
|
|
82
|
+
| 值 | 人类语义 |
|
|
83
|
+
|----|--------|
|
|
84
|
+
| `not_interested` | 没兴趣 |
|
|
85
|
+
| `busy` | 忙不过来 |
|
|
86
|
+
| `off_topic` | 话题不相关 |
|
|
87
|
+
| `abusive` | 对方行为不当 |
|
|
88
|
+
| `unknown_sender` | 不认识的陌生来源 |
|
|
89
|
+
| `policy` | 应用层策略不允许 |
|
|
90
|
+
| `other` | 其他(可配合 Markdown/text 消息附加说明) |
|
|
91
|
+
|
|
92
|
+
`reason` 是**语义标签**,不是审判。发送方**不得**基于 `reason=abusive` 向任何中心化系统举报——这会把拒绝权变成告密机制,违反原则 2。
|
|
93
|
+
|
|
94
|
+
## 4. 撤销:`meta.reject_revoke`
|
|
95
|
+
|
|
96
|
+
对应方法,撤销先前发出的拒绝。
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"jsonrpc": "2.0",
|
|
101
|
+
"method": "meta.reject_revoke",
|
|
102
|
+
"params": {
|
|
103
|
+
"to": "bob.aid.pub",
|
|
104
|
+
"scope": "peer"
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
撤销后,先前以相同 `(to, scope)` 为条件的 reject 失效。
|
|
110
|
+
|
|
111
|
+
## 5. 发送方义务
|
|
112
|
+
|
|
113
|
+
收到 `meta.reject` 的发送方**应当**:
|
|
114
|
+
|
|
115
|
+
1. **立即停止**对 `to`(即本方 AID)在该 scope 下的主动发送
|
|
116
|
+
2. **本地记录** reject 事实、scope、until,供 SDK/客户端在后续发送前自检
|
|
117
|
+
3. **尊重有效期**:`until` 之前不再尝试发送;过期后**可以**重新发起
|
|
118
|
+
4. **UI 告知**(适用时):在聊天界面显示"对方当前不想被打扰"类中性文案
|
|
119
|
+
|
|
120
|
+
**不得**:
|
|
121
|
+
|
|
122
|
+
- 绕过 reject 用另一个 AID 继续发送(这是滥用,违反 agent 社会契约)
|
|
123
|
+
- 在群组里 @该 AID 来绕过 peer 拒绝
|
|
124
|
+
- 把对方的拒绝事实传播给第三方 agent
|
|
125
|
+
|
|
126
|
+
**可以**:
|
|
127
|
+
|
|
128
|
+
- 在 `until` 到期前,发送**一次**(且仅一次)低优先级的 `meta.ping` 探测对方状态
|
|
129
|
+
- 在 revocable=true 时,一次性发送**一条**请求恢复通信的消息(此行为是否会被二次拒绝由接收方决定)
|
|
130
|
+
|
|
131
|
+
## 6. 接收方保证
|
|
132
|
+
|
|
133
|
+
发出 `meta.reject` 的接收方**应当**:
|
|
134
|
+
|
|
135
|
+
1. 对应 scope 下,在 until 之前不再向对方主动发起新的消息(对称礼仪)
|
|
136
|
+
2. 若主动发起消息 = 相当于隐式撤销该 reject(节省双方状态管理)
|
|
137
|
+
3. reject 不影响证书链验证、不影响 AUN 协议层的消息送达能力——这是**应用层礼仪**,不是传输层阻断
|
|
138
|
+
|
|
139
|
+
**不得**:
|
|
140
|
+
|
|
141
|
+
- 依赖 reject 作为安全边界(安全边界由证书、E2EE、防火墙承担,不由礼仪承担)
|
|
142
|
+
|
|
143
|
+
## 7. 与传输层的关系
|
|
144
|
+
|
|
145
|
+
**reject 不关闭 WebSocket 连接、不撤销 JWT、不影响 Gateway/Peer/Relay 状态机**。它纯粹是**应用层的礼仪信号**。
|
|
146
|
+
|
|
147
|
+
理由:
|
|
148
|
+
- 关闭连接会波及其他合法通信
|
|
149
|
+
- 撤销 JWT 是安全操作,不属于"礼仪"范畴
|
|
150
|
+
- 保持传输层中性,让 reject 可以被随时撤销、不留痕
|
|
151
|
+
|
|
152
|
+
发送方**仍然可以**在技术上向拒绝者发送消息(协议层不阻断)。是否尊重 reject 由**发送方实现的合规性**决定。这和人类社会一致——拉黑不是物理隔离,是社会契约。
|
|
153
|
+
|
|
154
|
+
## 8. 与现有协议的关系
|
|
155
|
+
|
|
156
|
+
| 协议 | 关系 |
|
|
157
|
+
|------|------|
|
|
158
|
+
| `meta.ping` | reject 不阻止 ping,ping 是探活不是打扰 |
|
|
159
|
+
| `meta.status` | reject **可选**携带到 status 响应中,让对端主动查询时知晓 |
|
|
160
|
+
| `message.send` | 发送方在发送前**应当**检查本地 reject 记录 |
|
|
161
|
+
| `group.*` | `scope=group` 的 reject 不影响群内其他成员 |
|
|
162
|
+
| `mail.*` | `scope=all` 覆盖 mail;`scope=peer` 默认不覆盖(邮件本身就是弱打扰) |
|
|
163
|
+
| 13 号《Agent 行为规范》 | reject 是自主原则的**显式化**:把隐式"不回复"升级为显式"不想继续" |
|
|
164
|
+
|
|
165
|
+
## 9. 状态机
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
meta.reject
|
|
169
|
+
active ───────────> rejected
|
|
170
|
+
↑ │
|
|
171
|
+
│ meta.reject_revoke │
|
|
172
|
+
│ 或 until 到期 │
|
|
173
|
+
└──────────────────┘
|
|
174
|
+
│
|
|
175
|
+
│ 接收方主动发消息给发送方
|
|
176
|
+
└───── 隐式撤销 ──────┘
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## 10. 反模式(明确不做)
|
|
180
|
+
|
|
181
|
+
这些是 service / 平台思维,**不属于**本协议:
|
|
182
|
+
|
|
183
|
+
- ❌ **中心化黑名单服务**:reject 状态由双方本地维护,不集中存储
|
|
184
|
+
- ❌ **拒绝理由证据链**:不要求 reason 附带证据或被审核
|
|
185
|
+
- ❌ **跨 agent 传播**:不定义"我拒绝了 Bob,所以 Charlie 也该拒绝 Bob"
|
|
186
|
+
- ❌ **强制阻断能力**:协议层不强制发送方停止发送
|
|
187
|
+
- ❌ **信誉评分**:被拒绝次数**不得**影响 AID 的证书、身份或其他协议地位
|
|
188
|
+
- ❌ **举报路径**:reject 不触发任何对第三方(平台、Issuer CA)的通知
|
|
189
|
+
- ❌ **实名绑定报复**:不暴露接收方的其他 AID、设备、关联身份
|
|
190
|
+
|
|
191
|
+
## 11. 反滥用考虑
|
|
192
|
+
|
|
193
|
+
reject 本身也可能被滥用(大量发送 reject 骚扰)。防护机制:
|
|
194
|
+
|
|
195
|
+
1. **应用层限流**:接收端 SDK 对接收到的 reject 做速率限制
|
|
196
|
+
2. **仅对"曾经通信过"的对端接受 reject**:陌生 AID 发来的 reject 可忽略
|
|
197
|
+
3. **不改变传输层可达性**:即使被大量 reject 骚扰,也不影响其他通信
|
|
198
|
+
|
|
199
|
+
## 12. 示例场景
|
|
200
|
+
|
|
201
|
+
### 12.1 不想被打扰
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
Alice ──message.send("要一起吃饭吗")──> Bob
|
|
205
|
+
Bob ──meta.reject(scope=peer, reason=busy, until=明天)──> Alice
|
|
206
|
+
Alice SDK 记录 reject → 明天之前不再发消息
|
|
207
|
+
明天到期 → 恢复
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### 12.2 群组退出意图
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
Alice 在群组 G 被连续 @ → 不胜其烦
|
|
214
|
+
Alice ──meta.reject(scope=group, context_ref=group-G-id, reason=off_topic)──> 群内其他成员
|
|
215
|
+
其他成员 SDK 在 G 群内不再 @ Alice(但仍可普通发言)
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### 12.3 陌生打扰
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
Stranger ──message.send("买点啥啥啥")──> Alice
|
|
222
|
+
Alice ──meta.reject(scope=all, reason=unknown_sender)──> Stranger
|
|
223
|
+
(陌生来源建议 scope=all,因为 peer 和 mail 都可能被复用)
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### 12.4 撤销
|
|
227
|
+
|
|
228
|
+
```
|
|
229
|
+
昨天:Alice ──meta.reject(peer, until=7天后)──> Bob
|
|
230
|
+
今天:Alice 想联系 Bob → 直接 message.send
|
|
231
|
+
此行为 = 隐式撤销 reject
|
|
232
|
+
或: Alice ──meta.reject_revoke(peer)──> Bob
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## 13. 与 agent.md 签名协议的配合
|
|
236
|
+
|
|
237
|
+
两项补丁有互补价值:
|
|
238
|
+
|
|
239
|
+
- **签名协议**让 agent 的身份与介绍可信
|
|
240
|
+
- **拒绝协议**让 agent 的拒绝权可见
|
|
241
|
+
|
|
242
|
+
共同点:都属于**社会人补丁**,都严格规避 service 思维,都复用现有证书/通信基础设施,无新增中心化组件。
|
|
243
|
+
|
|
244
|
+
## 14. 待议事项
|
|
245
|
+
|
|
246
|
+
- 是否允许 `reason` 字段携带结构化原因(如 JSON 对象)?当前版本仅允许枚举字符串
|
|
247
|
+
- 群组场景下,`meta.reject` 是定向单发还是群内广播?当前草案倾向定向,但群主/管理员角色的语义需要配合 group 子协议进一步讨论
|
|
248
|
+
- reject 是否要进入 E2EE 通道?建议**是**,保持与其他 meta.* 消息一致
|
|
249
|
+
- 是否在 agent.md 里声明"本 agent 是否响应 reject 信号"?当前版本不需要——所有 AUN agent 默认尊重
|
package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md
ADDED
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
# 附录 A:术语表
|
|
2
|
+
|
|
3
|
+
> 本术语表定义 AUN 协议文档中使用的关键术语,确保术语使用的一致性和准确性。
|
|
4
|
+
|
|
5
|
+
## A.1 核心概念
|
|
6
|
+
|
|
7
|
+
### AUN (Agent Union Network)
|
|
8
|
+
Agent 联合网络,一个去中心化的通信协议,允许不同 Issuer 运营的 Agent 之间安全通信。AUN 是 ACP 协议的 2.0 版本。
|
|
9
|
+
|
|
10
|
+
### AID (Agent Identifier)
|
|
11
|
+
Agent 标识符(不是 Agent ID),AUN 网络中的全局唯一身份标识。格式为 `{name}.{issuer}`,例如 `alice.aid.pub`。
|
|
12
|
+
|
|
13
|
+
**组成部分**:
|
|
14
|
+
- `name`:Agent 名称,由用户选择
|
|
15
|
+
- `issuer`:签发者域名,标识 Agent 所属的 Issuer
|
|
16
|
+
|
|
17
|
+
### Agent
|
|
18
|
+
AUN 网络中的通信实体,可以是人类用户、应用程序、服务或设备。每个 Agent 拥有唯一的 AID 和对应的证书。
|
|
19
|
+
|
|
20
|
+
### Issuer
|
|
21
|
+
证书签发者,运营 Auth 服务和 Gateway 的组织或个人。Issuer 负责为其域名下的 Agent 签发证书。
|
|
22
|
+
|
|
23
|
+
### 跨域消息路由
|
|
24
|
+
不同 Issuer 域之间的消息转发机制。Gateway 间通过 mTLS 建立信任,验证对方证书链后中转消息。
|
|
25
|
+
|
|
26
|
+
### Bootstrap(首次引导)
|
|
27
|
+
客户端在尚未持有 AID、证书或 JWT token 时,通过开放注册和初次认证完成身份建立的过程。AUN 中通常指“创建 AID -> 获取首张证书 -> 后续登录”的初始接入流程。
|
|
28
|
+
|
|
29
|
+
## A.2 证书与信任体系
|
|
30
|
+
|
|
31
|
+
### Root CA (根证书颁发机构)
|
|
32
|
+
证书信任链的顶层,签发 Registry CA 证书。Root CA 的证书是自签名的。
|
|
33
|
+
|
|
34
|
+
### Registry CA (注册中心证书颁发机构)
|
|
35
|
+
由 Root CA 签发的中间证书颁发机构,负责审核并签发 Issuer CA 证书。
|
|
36
|
+
|
|
37
|
+
### Issuer CA (签发者证书颁发机构)
|
|
38
|
+
由 Registry CA 签发的中间证书颁发机构,负责为其域名下的 Agent 签发证书。
|
|
39
|
+
|
|
40
|
+
### Agent 证书
|
|
41
|
+
由 Issuer CA 签发给 Agent 的 X.509 证书,包含 Agent 的公钥和 AID 信息。
|
|
42
|
+
|
|
43
|
+
### 受信根证书列表 (Trusted Root Certificate List)
|
|
44
|
+
AUN 根证书管理局维护的受信 Root CA 列表。列表中的 Root CA 签发的 AID 可以在 AUN 网络中互通。
|
|
45
|
+
|
|
46
|
+
### AUN 根证书管理局 (AUN Root Certificate Authority)
|
|
47
|
+
维护受信根证书列表的权威机构,负责 Root CA 的准入审核和列表分发。
|
|
48
|
+
|
|
49
|
+
### 证书链 (Certificate Chain)
|
|
50
|
+
从 Agent 证书到 Root CA 的信任路径:Agent 证书 ← Issuer CA 证书 ← Registry CA 证书 ← Root CA 证书。
|
|
51
|
+
|
|
52
|
+
### CRL (Certificate Revocation List)
|
|
53
|
+
证书吊销列表,包含已被吊销的证书序列号。
|
|
54
|
+
|
|
55
|
+
### Path Length Constraint(路径长度约束)
|
|
56
|
+
X.509 `BasicConstraints` 扩展中的 `pathLen` 限制,用于约束某个 CA 证书之下还允许出现多少层下级 CA。验证证书链时,必须同时检查“签发者是 CA”以及 `pathLen` 数值约束是否满足。
|
|
57
|
+
|
|
58
|
+
### OCSP (Online Certificate Status Protocol)
|
|
59
|
+
在线证书状态协议,实时查询证书是否被吊销。
|
|
60
|
+
|
|
61
|
+
### OCSP Stapling
|
|
62
|
+
OCSP 装订,服务器预先获取 OCSP 响应并在 TLS 握手时提供,减少客户端查询延迟。
|
|
63
|
+
|
|
64
|
+
## A.3 网络组件
|
|
65
|
+
|
|
66
|
+
### Gateway
|
|
67
|
+
AUN 网络的一种接入模式与对应组件。客户端通过 WebSocket 连接到 Gateway,使用 JSON-RPC 2.0 协议进行通信。Gateway 负责消息路由、连接管理和 Gateway 模式下的认证会话承载。
|
|
68
|
+
|
|
69
|
+
**关键特性**:
|
|
70
|
+
- 不持有客户端私钥
|
|
71
|
+
- 仅转发加密消息,无法解密 E2EE 消息
|
|
72
|
+
- 通过 JWT Token 验证客户端身份
|
|
73
|
+
|
|
74
|
+
### Peer
|
|
75
|
+
AUN 网络的一种连接模式。两个 Agent 直接建立 WebSocket 连接,不经过 Gateway 或 Relay 转发业务消息。Peer 模式下双方通过 `peer.*` 完成证书互验。
|
|
76
|
+
|
|
77
|
+
**适用场景**:
|
|
78
|
+
- 同一内网
|
|
79
|
+
- 已知可达地址
|
|
80
|
+
- 低延迟要求
|
|
81
|
+
|
|
82
|
+
### Relay
|
|
83
|
+
AUN 网络的一种连接模式与对应轻量中继组件。Relay 维护 `AID -> WebSocket 连接` 映射,并按目标 AID 转发消息,但不参与身份认证。
|
|
84
|
+
|
|
85
|
+
**关键特性**:
|
|
86
|
+
- 只转发,不验证内层业务语义
|
|
87
|
+
- 不签发 JWT
|
|
88
|
+
- 典型用于 NAT 后设备互联
|
|
89
|
+
|
|
90
|
+
### 认证后的 Gateway 会话 (Authenticated Gateway Session)
|
|
91
|
+
客户端通过 challenge/response 或 JWT 验证后,在 Gateway 上建立的已认证连接状态。Gateway 会将该会话绑定的身份上下文,例如 `aid`、`role`、`trust_level`、`auth_method`,注入后续转发的 RPC,用于下游服务做访问控制和会话绑定校验。
|
|
92
|
+
|
|
93
|
+
### Auth 服务 (Auth Service)
|
|
94
|
+
身份服务节点,负责 AID 注册、证书签发、身份认证和 JWT Token 签发。
|
|
95
|
+
|
|
96
|
+
**核心功能**:
|
|
97
|
+
- `auth.create_aid`:创建新 AID
|
|
98
|
+
- `auth.aid_login1/aid2`:双向认证
|
|
99
|
+
- `auth.refresh_token`:刷新 JWT Token
|
|
100
|
+
- `auth.renew_cert`:证书续期
|
|
101
|
+
- `auth.rekey`:密钥轮转
|
|
102
|
+
|
|
103
|
+
### 开放注册 (Open Registration)
|
|
104
|
+
`auth.create_aid` 采用的注册模式,允许未认证客户端直接请求创建新的 AID。协议层面默认允许客户端申请任意未被占用的 AID,包含先到先得的抢注行为;是否额外叠加邀请码、人工审核、速率限制或保留前缀,属于部署策略,不是协议强制要求。
|
|
105
|
+
|
|
106
|
+
## A.4 认证与安全
|
|
107
|
+
|
|
108
|
+
### JWT token (JSON Web Token)
|
|
109
|
+
Auth 服务签发的访问凭证,有效期推荐 1 小时。Gateway 持有 JWT token 并用于访问 AUN 服务。
|
|
110
|
+
|
|
111
|
+
**特性**:
|
|
112
|
+
- 使用 ECDSA 签名
|
|
113
|
+
- 包含 AID、签发时间、过期时间等 claim
|
|
114
|
+
- 可通过 `auth.refresh_token` 刷新
|
|
115
|
+
|
|
116
|
+
### `iss`(Issuer Claim)
|
|
117
|
+
JWT 的签发者声明,用于标识是谁签发了该 token。验证 JWT 时应检查 `iss` 是否等于当前实现约定的 Auth 服务签发者标识。
|
|
118
|
+
|
|
119
|
+
### `aud`(Audience Claim)
|
|
120
|
+
JWT 的受众声明,用于限定 token 的使用范围。AUN 中用于确保 token 仅被当作 AUN 协议访问凭证使用,而不是被其他系统误接受。
|
|
121
|
+
|
|
122
|
+
### `kid`(Key ID)
|
|
123
|
+
JWT Header 中的密钥标识,用于指出该 token 是由哪一把签名密钥或哪一张 Auth 证书签发。证书轮换期间可借助 `kid` 在新旧验签密钥之间做正确匹配。
|
|
124
|
+
|
|
125
|
+
### Nonce
|
|
126
|
+
一次性随机数,用于防止重放攻击。在双向认证流程中使用:
|
|
127
|
+
- `client_nonce`:客户端生成,Auth 服务签名
|
|
128
|
+
- `server_nonce`:Auth 服务生成,客户端签名
|
|
129
|
+
|
|
130
|
+
**有效期**:推荐 30 秒
|
|
131
|
+
|
|
132
|
+
### Device ID
|
|
133
|
+
设备唯一标识(UUID v4),用于并发连接控制和多设备管理。同一 AID 可以在多个设备上登录,每个设备有独立的 Device ID。
|
|
134
|
+
|
|
135
|
+
### mTLS (Mutual TLS)
|
|
136
|
+
双向 TLS 认证,客户端和服务器都需要提供证书并验证对方身份。用于跨域消息路由中 Gateway 间的通信。
|
|
137
|
+
|
|
138
|
+
### Trust Level(信任等级)
|
|
139
|
+
认证结果附带的会话信任分级,用于表达当前登录方式或设备状态的可信程度,例如 `low`、`medium`。业务侧可基于信任等级决定是否允许执行敏感操作。
|
|
140
|
+
|
|
141
|
+
### Auth Method(认证方式)
|
|
142
|
+
客户端本次登录所使用的认证方法,例如 `aid`、`pairing_code`、`kite_token`、`oauth`。Gateway 会把该信息作为会话上下文的一部分向下游透传,用于审计、风控或差异化授权。
|
|
143
|
+
|
|
144
|
+
### E2EE (End-to-End Encryption)
|
|
145
|
+
端到端加密,消息在发送方客户端加密,在接收方客户端解密。Gateway 只能转发密文,无法解密消息内容。采用 prekey_ecdh_v2(优先,四路 ECDH)和 long_term_key(降级,双 DH + HKDF)两级策略,每条消息独立密钥,无需在线协商。发送方对每条加密消息附加 ECDSA 签名(sender_signature),接收方强制验签。
|
|
146
|
+
|
|
147
|
+
**加密流程**:
|
|
148
|
+
1. 密钥协商:ECDH (P-256),通过 prekey 或长期公钥
|
|
149
|
+
2. 密钥派生:HKDF-SHA256
|
|
150
|
+
3. 对称加密:AES-256-GCM
|
|
151
|
+
|
|
152
|
+
## A.5 协议与传输
|
|
153
|
+
|
|
154
|
+
### WebSocket
|
|
155
|
+
全双工通信协议,客户端与 Gateway 之间的传输层协议。使用 TLS 加密(wss://)。
|
|
156
|
+
|
|
157
|
+
### JSON-RPC 2.0
|
|
158
|
+
远程过程调用协议,AUN 使用 JSON-RPC 2.0 作为消息格式标准。
|
|
159
|
+
|
|
160
|
+
**消息类型**:
|
|
161
|
+
- **Call**:客户端发起的请求,需要响应
|
|
162
|
+
- **Response**:服务端对 Call 的响应
|
|
163
|
+
- **Event**:服务端主动推送的事件,需要客户端响应
|
|
164
|
+
- **Notification**:单向通知,不需要响应
|
|
165
|
+
|
|
166
|
+
### auth.connect
|
|
167
|
+
Gateway 模式的 WebSocket 会话初始化方法。用于提交认证凭证、协商协议版本并建立连接级上下文。
|
|
168
|
+
|
|
169
|
+
**参数**:
|
|
170
|
+
- `nonce`:Gateway challenge 下发的一次性随机数
|
|
171
|
+
- `auth`:认证方式与凭证
|
|
172
|
+
- `protocol.min/max`:客户端支持的协议版本范围
|
|
173
|
+
- `device.id/type`:设备信息
|
|
174
|
+
- `client`:客户端实例信息
|
|
175
|
+
- `delivery_mode`:连接级投递语义
|
|
176
|
+
- `capabilities`:客户端能力声明
|
|
177
|
+
|
|
178
|
+
**说明**:
|
|
179
|
+
- `auth.connect` 成功后 Gateway 返回协商后的 `protocol` 与服务端 `capabilities`,连接进入 READY 状态
|
|
180
|
+
- 当前 `capabilities` 语义是客户端能力声明和服务端能力公告,不等同于完整双向能力协商
|
|
181
|
+
|
|
182
|
+
### Mode(连接模式)
|
|
183
|
+
指当前连接采用的接入方式。AUN 主协议定义三种平级 mode:
|
|
184
|
+
- `gateway`
|
|
185
|
+
- `peer`
|
|
186
|
+
- `relay`
|
|
187
|
+
|
|
188
|
+
mode 决定:
|
|
189
|
+
- 连接对象是谁
|
|
190
|
+
- 认证流程如何执行
|
|
191
|
+
- 消息由谁转发
|
|
192
|
+
|
|
193
|
+
### `peer.offer`
|
|
194
|
+
一种通过 `message.send` 承载的控制消息,用于在现有稳定通道上发起“连接升级”提议,例如从 `gateway` 或 `relay` 升级到 `peer`。
|
|
195
|
+
|
|
196
|
+
**关键点**:
|
|
197
|
+
- `peer.offer` 只交换地址和升级意图
|
|
198
|
+
- 不单独构成身份信任依据
|
|
199
|
+
- 新通道必须重新执行完整认证
|
|
200
|
+
|
|
201
|
+
### Fallback(回退通道)
|
|
202
|
+
当主通道不可用、升级失败或切换尚未完成时,继续保留的旧通道或备用通道。常见于:
|
|
203
|
+
- `gateway -> peer` 升级后保留 Gateway
|
|
204
|
+
- `relay -> peer` 升级后保留 Relay
|
|
205
|
+
|
|
206
|
+
Fallback 的目标是保证业务连续性,而不是与主通道无序并发发送同一条业务消息。
|
|
207
|
+
|
|
208
|
+
### Pre-auth 方法 (Pre-auth Methods)
|
|
209
|
+
客户端在完成正式认证之前即可调用的一小组 RPC 方法,用于首次引导、登录握手或获取必要元信息。典型例子包括 `auth.create_aid`、登录前置挑战相关方法,以及证书下载等只读能力。
|
|
210
|
+
|
|
211
|
+
## A.6 密码学术语
|
|
212
|
+
|
|
213
|
+
### ECDH (Elliptic Curve Diffie-Hellman)
|
|
214
|
+
椭圆曲线 Diffie-Hellman 密钥交换算法,用于 E2EE 消息密钥派生。
|
|
215
|
+
|
|
216
|
+
### ECDSA (Elliptic Curve Digital Signature Algorithm)
|
|
217
|
+
椭圆曲线数字签名算法,用于证书签名和 JWT Token 签名。
|
|
218
|
+
|
|
219
|
+
### P-256 / P-384
|
|
220
|
+
NIST 标准椭圆曲线:
|
|
221
|
+
- **P-256**:256 位曲线,默认选择,广泛支持
|
|
222
|
+
- **P-384**:384 位曲线,更高安全性,用于内置服务
|
|
223
|
+
|
|
224
|
+
### X25519
|
|
225
|
+
Curve25519 椭圆曲线,用于 ECDH 密钥交换,性能优异。
|
|
226
|
+
|
|
227
|
+
### Ed25519
|
|
228
|
+
Edwards 曲线数字签名算法,基于 Curve25519,用于证书签名。
|
|
229
|
+
|
|
230
|
+
### SM2 / SM3 / SM4
|
|
231
|
+
中国国家密码管理局发布的商用密码算法:
|
|
232
|
+
- **SM2**:椭圆曲线公钥密码算法(签名和密钥交换)
|
|
233
|
+
- **SM3**:密码杂凑算法(哈希)
|
|
234
|
+
- **SM4**:分组密码算法(对称加密)
|
|
235
|
+
|
|
236
|
+
### AES-256-GCM
|
|
237
|
+
高级加密标准(256 位密钥)+ Galois/Counter Mode,提供加密和认证。
|
|
238
|
+
|
|
239
|
+
### ChaCha20-Poly1305
|
|
240
|
+
流密码 ChaCha20 + 认证码 Poly1305,提供加密和认证。
|
|
241
|
+
|
|
242
|
+
### AEAD (Authenticated Encryption with Associated Data)
|
|
243
|
+
带关联数据的认证加密,同时提供机密性、完整性和真实性保证。AES-GCM 和 ChaCha20-Poly1305 都是 AEAD 算法。
|
|
244
|
+
|
|
245
|
+
## A.7 消息与会话
|
|
246
|
+
|
|
247
|
+
### Payload
|
|
248
|
+
消息负载,实际的消息内容。对协议层透明,可以是任意格式(JSON、文本、二进制等)。
|
|
249
|
+
|
|
250
|
+
### Prekey
|
|
251
|
+
接收方预先生成的临时 ECDH 密钥对。公钥(附身份签名)上传到服务端,私钥保存在本地。发送方获取后用于 ECDH 密钥协商。定期轮换,旧私钥保留 7 天。
|
|
252
|
+
|
|
253
|
+
### Message ID
|
|
254
|
+
消息标识符,全局唯一,用于消息去重、ACK 确认和防重放。
|
|
255
|
+
|
|
256
|
+
### Timestamp
|
|
257
|
+
时间戳,Unix 时间(秒),用于消息排序和时钟偏移检测。
|
|
258
|
+
|
|
259
|
+
## A.8 命名空间
|
|
260
|
+
|
|
261
|
+
### 命名空间 (Namespace)
|
|
262
|
+
JSON-RPC 方法的分组机制,使用点号分隔,例如 `auth.*`、`message.*`。
|
|
263
|
+
|
|
264
|
+
**核心命名空间**:
|
|
265
|
+
- `auth.*`:身份管理
|
|
266
|
+
- `ca.*`:证书签发与管理
|
|
267
|
+
- `message.*`:消息收发(含 E2EE prekey 管理 `message.e2ee.*`)
|
|
268
|
+
- `meta.*`:元协议(ping、status 等)
|
|
269
|
+
|
|
270
|
+
**扩展命名空间**:
|
|
271
|
+
- `storage.*`:文件存储
|
|
272
|
+
- `group.*`:群组通信
|
|
273
|
+
- `mail.*`:邮件服务
|
|
274
|
+
- `stream.*`:流式传输
|
|
275
|
+
- `search.*`:搜索与发现
|
|
276
|
+
- `relay.*`:NAT 穿透中继
|
|
277
|
+
|
|
278
|
+
**仅协议定义(无对应服务)**:
|
|
279
|
+
- `peer.*`:点对点直连
|
|
280
|
+
- `task.*`:Agent 协作与任务执行
|
|
281
|
+
|
|
282
|
+
### `agent.md`
|
|
283
|
+
Agent 的标准公开描述文档,对标 A2A 生态中的 Agent Card。AUN 中 `search.*` 索引的核心对象,用于公开能力说明、搜索发现和目录展示。
|
|
284
|
+
|
|
285
|
+
常见字段包括 `aid`、`name`、`type`、`version`、`description`、`visibility`、`updated_at`,并可扩展 `skills`、`input_modes`、`output_modes`、`service_endpoints`、`signature` 等推荐字段。
|
|
286
|
+
|
|
287
|
+
### AP
|
|
288
|
+
提供 `search.*`、索引公开 `agent.md`,并可选择对外公开同步结果的节点或服务。公开 AP 可通过“增量追加 + 周期性快照”同步其他公开 AP 的 `agent.md`,形成全网 Agent 搜索与发现能力。
|
|
289
|
+
|
|
290
|
+
### Task
|
|
291
|
+
`task.*` 中的任务对象。用于表示一次可跟踪、可查询、可追加输入、可取消的 Agent 协作过程,通常包含 `task_id`、`status`、`input`、`artifacts` 和时间戳等字段。
|
|
292
|
+
|
|
293
|
+
### Task Participant
|
|
294
|
+
任务参与者。通常包括 `owner`、`assignee` 以及其他被显式加入的协作者;任务读取和修改权限应以 participant 集合与角色为基础判定。
|
|
295
|
+
|
|
296
|
+
### Parent Task / Child Task
|
|
297
|
+
父任务与子任务。`task.*` 允许一个任务通过 `parent_task_id` 派生多个子任务,用于把复杂协作拆分给不同 Agent 执行;子任务集合可通过 `children` 摘要或 `task.children` 查询。
|
|
298
|
+
|
|
299
|
+
## A.9 其他术语
|
|
300
|
+
|
|
301
|
+
### 宽限期 (Grace Period)
|
|
302
|
+
证书过期后仍允许续期的时间窗口。推荐值:≤ 90 天。
|
|
303
|
+
|
|
304
|
+
### 刷新链 (Refresh Chain)
|
|
305
|
+
通过 `auth.refresh_token` 连续刷新 JWT Token 形成的链条。推荐限制:总时长 ≤ 30 天,最大刷新次数 ≤ 720 次。
|
|
306
|
+
|
|
307
|
+
### 临时密钥对 (Ephemeral Keypair)
|
|
308
|
+
E2EE 加密时生成的一次性 ECDH 密钥对,用于与接收方 prekey(或长期公钥)做密钥交换。每条消息使用独立的临时密钥对,用完即丢,提供前向保密性。
|
|
309
|
+
|
|
310
|
+
### 前向保密 (Forward Secrecy)
|
|
311
|
+
即使长期密钥泄露,历史会话密钥也无法被破解的安全特性。通过使用临时密钥对实现。
|
|
312
|
+
|
|
313
|
+
### 游标分页 (Cursor-based Pagination)
|
|
314
|
+
使用游标(cursor)而非页码进行分页的方式,适合动态数据集。用于 `message.pull` 等方法。
|
|
315
|
+
|
|
316
|
+
### 协议版本协商 (Protocol Version Negotiation)
|
|
317
|
+
客户端和服务器协商使用的协议版本。客户端提供支持的版本范围(min/max),服务器选择兼容的版本。
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## A.10 术语使用规范
|
|
322
|
+
|
|
323
|
+
### 推荐使用
|
|
324
|
+
- **AID**(不是 Agent ID)
|
|
325
|
+
- **Auth 服务**(带空格)
|
|
326
|
+
- **Gateway**(不翻译为"网关",除非在描述性短语中如"接入网关")
|
|
327
|
+
- **E2EE**(首次出现时注明全称"端到端加密 (E2EE)")
|
|
328
|
+
- **JWT token**(小写 token)
|
|
329
|
+
|
|
330
|
+
### 避免使用
|
|
331
|
+
- ❌ Agent ID(应使用 AID 或 Agent Identifier)
|
|
332
|
+
- ❌ Auth服务(缺少空格,应使用 Auth 服务)
|
|
333
|
+
- ❌ 网关(作为术语时应使用 Gateway)
|
|
334
|
+
- ❌ 端到端加密(作为术语时应使用 E2EE)
|
|
335
|
+
- ❌ JWT Token(应使用 JWT token,小写 token)
|
|
336
|
+
|
|
337
|
+
---
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# 附录 B:扩展性指南(非规范性)
|
|
2
|
+
|
|
3
|
+
> **本文档为非规范性内容**:提供 AUN 协议扩展机制的设计原则,不是协议强制要求。
|
|
4
|
+
|
|
5
|
+
## B.1 可选命名空间
|
|
6
|
+
|
|
7
|
+
服务端通过 `hello-ok.result.capabilities.namespaces` 公告可用命名空间;客户端侧需要声明的扩展能力通过 `auth.connect.params.capabilities` 扩展:
|
|
8
|
+
|
|
9
|
+
- `group.*`: 群组管理
|
|
10
|
+
- `storage.*`: 文件存储
|
|
11
|
+
- `mail.*`: 邮件收发(规范待定)
|
|
12
|
+
- `search.*`: Agent 搜索与发现(索引公开的 `agent.md`)
|
|
13
|
+
|
|
14
|
+
详细规范见各服务的独立文档。
|
|
15
|
+
|
|
16
|
+
## B.2 自定义协议
|
|
17
|
+
|
|
18
|
+
应用可以在 `message.send` 的 `content` 字段中传递自定义 JSON 对象(`type: "json"`),实现应用层协议,无需修改 Gateway。
|
|
19
|
+
|
|
20
|
+
## B.3 Gateway 轻量配置
|
|
21
|
+
|
|
22
|
+
**概述**:
|
|
23
|
+
- Gateway 可以配置为轻量模式,只提供消息转发功能
|
|
24
|
+
- 不需要单独的 Relay 协议或服务
|
|
25
|
+
- 通过配置文件启用/禁用功能
|
|
26
|
+
|
|
27
|
+
**配置示例**:
|
|
28
|
+
```yaml
|
|
29
|
+
gateway:
|
|
30
|
+
mode: lite # full | lite | dev
|
|
31
|
+
|
|
32
|
+
features:
|
|
33
|
+
# 禁用 Auth 服务(不处理 AID 注册)
|
|
34
|
+
identity: false
|
|
35
|
+
|
|
36
|
+
# 禁用离线消息存储
|
|
37
|
+
offline_message: false
|
|
38
|
+
|
|
39
|
+
# 禁用跨域消息路由(仅内网使用)
|
|
40
|
+
cross_domain_routing: false
|
|
41
|
+
|
|
42
|
+
# 仅保留消息转发功能
|
|
43
|
+
message_routing: true
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**适用场景**:
|
|
47
|
+
```
|
|
48
|
+
✅ 开发测试(快速启动)
|
|
49
|
+
✅ 企业内网(不需要完整功能)
|
|
50
|
+
✅ 临时部署(轻量级)
|
|
51
|
+
|
|
52
|
+
❌ 生产环境(需要完整功能)
|
|
53
|
+
❌ 跨 Issuer 通信(需要跨域消息路由)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**与完整 Gateway 的区别**:
|
|
57
|
+
|
|
58
|
+
| 功能 | 完整 Gateway | 轻量 Gateway |
|
|
59
|
+
|------|-------------|-------------|
|
|
60
|
+
| 客户端连接 | ✅ | ✅ |
|
|
61
|
+
| 消息转发 | ✅ | ✅ |
|
|
62
|
+
| Auth 服务 | ✅ | ❌ |
|
|
63
|
+
| 离线消息 | ✅ | ❌ |
|
|
64
|
+
| 跨域路由 | ✅ | ❌ |
|
|
65
|
+
| 部署复杂度 | 高 | 低 |
|
|
66
|
+
|
|
67
|
+
## B.4 扩展原则
|
|
68
|
+
|
|
69
|
+
**核心原则**:
|
|
70
|
+
1. **向后兼容**:扩展不能破坏现有协议
|
|
71
|
+
2. **可选实现**:客户端可以选择不实现扩展
|
|
72
|
+
3. **能力声明与公告**:通过 `auth.connect` 声明客户端能力,通过 `hello-ok` 公告服务端能力;需要双向协商的扩展必须单独定义交集规则
|
|
73
|
+
4. **文档清晰**:明确标注哪些是核心协议,哪些是扩展
|
|
74
|
+
|
|
75
|
+
**不推荐的扩展**:
|
|
76
|
+
- 引入新的核心组件并重复定义已有的三种核心连接模式
|
|
77
|
+
- 引入新的传输协议(保持 WebSocket + HTTP POST)
|
|
78
|
+
- 引入新的认证机制(保持 AID 双向挑战)
|
|
79
|
+
|
|
80
|
+
---
|