@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,419 @@
|
|
|
1
|
+
# 15 - 离线推送通知协议 (Push Notification)
|
|
2
|
+
|
|
3
|
+
## 1. 概述
|
|
4
|
+
|
|
5
|
+
当目标 AID 的所有设备均离线时,AUN Gateway 通过事件通知将推送摘要发送给 `push_notify_aid`(推送代理 AID),由其完成最终的平台推送(APNs / FCM / WebPush 等)。
|
|
6
|
+
|
|
7
|
+
**设计原则:**
|
|
8
|
+
|
|
9
|
+
- push_notify_aid 是普通客户端 AID,不是 AUN 内部服务
|
|
10
|
+
- 通过事件通知(非 P2P 消息)下发推送摘要——轻量、实时、不持久化
|
|
11
|
+
- push_token 对 Gateway 完全不透明(opaque),push_notify_aid 自签自验
|
|
12
|
+
- 任意一台设备在线即不触发推送
|
|
13
|
+
- 推送内容仅含元数据,不含消息正文(E2EE 安全保证)
|
|
14
|
+
- 背压控制:串行确认,Gateway 等 push_notify_aid ack 后再发下一批
|
|
15
|
+
- 跨域推送:推送由**目标 AID 所属域**的 Gateway 触发,发送方域不参与
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 2. 架构
|
|
20
|
+
|
|
21
|
+
```mermaid
|
|
22
|
+
graph TB
|
|
23
|
+
Sender[发送方 AID] -->|message.send| GW[Gateway]
|
|
24
|
+
GW -->|目标全部离线| PA[PushAggregator]
|
|
25
|
+
PA -->|event/push.offline_message| GW
|
|
26
|
+
GW -->|事件通知| PNA[push_notify_aid<br/>推送代理客户端]
|
|
27
|
+
PNA -->|push.ack| GW
|
|
28
|
+
PNA -->|平台推送| PLATFORM[APNs / FCM / WebPush]
|
|
29
|
+
PLATFORM -->|通知| Target[目标终端]
|
|
30
|
+
|
|
31
|
+
PNA -.->|connect 到 Gateway 保持在线| GW
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**关键约束:**
|
|
35
|
+
|
|
36
|
+
- push_notify_aid 作为普通客户端 AID 连接到 Gateway,通过事件通知接收推送摘要
|
|
37
|
+
- push_notify_aid 离线时事件丢弃——推送是 best-effort,消息可靠性由 message.pull 保证
|
|
38
|
+
- 目标 AID 有任意一台设备在线时,不触发推送
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 3. 推送注册流程
|
|
43
|
+
|
|
44
|
+
### 3.1 应用层:客户端向推送代理注册
|
|
45
|
+
|
|
46
|
+
```mermaid
|
|
47
|
+
sequenceDiagram
|
|
48
|
+
participant App as 应用客户端
|
|
49
|
+
participant PNA as push_notify_aid
|
|
50
|
+
|
|
51
|
+
Note over App,PNA: 应用层行为,AUN 协议不规定细节
|
|
52
|
+
App->>PNA: 注册推送(aid, device_id, platform, device_token)
|
|
53
|
+
PNA->>PNA: 生成 push_token(格式自定)
|
|
54
|
+
PNA-->>App: push_token
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
push_token 的格式、签名算法、有效期完全由 push_notify_aid 自行决定。AUN 协议不做任何约束。
|
|
58
|
+
|
|
59
|
+
### 3.2 协议层:connect 时携带推送配置
|
|
60
|
+
|
|
61
|
+
```mermaid
|
|
62
|
+
sequenceDiagram
|
|
63
|
+
participant C as Client
|
|
64
|
+
participant GW as Gateway
|
|
65
|
+
|
|
66
|
+
C->>GW: connect(aid, token, push_notify_aid, push_token)
|
|
67
|
+
GW->>GW: 认证 AID 身份 ✓
|
|
68
|
+
GW->>GW: 持久化 push_config
|
|
69
|
+
GW-->>C: connected
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 4. 离线推送时序
|
|
75
|
+
|
|
76
|
+
```mermaid
|
|
77
|
+
sequenceDiagram
|
|
78
|
+
participant A as Sender AID
|
|
79
|
+
participant GW as Gateway
|
|
80
|
+
participant PA as PushAggregator
|
|
81
|
+
participant PNA as push_notify_aid
|
|
82
|
+
|
|
83
|
+
A->>GW: message.send(to=B, payload=...)
|
|
84
|
+
GW->>GW: 持久化消息 + 查询 B 在线状态
|
|
85
|
+
|
|
86
|
+
alt B 有任意设备在线
|
|
87
|
+
GW->>GW: 投递到 B 的在线 session
|
|
88
|
+
Note over GW: 不触发推送
|
|
89
|
+
else B 全部设备离线
|
|
90
|
+
GW->>PA: enqueue(target=B, from=A, msg_id, ts)
|
|
91
|
+
PA->>PA: 聚合窗口 + 频控 + 背压检查
|
|
92
|
+
|
|
93
|
+
alt 触发推送 且 in_flight < max
|
|
94
|
+
PA->>GW: event/push.offline_message
|
|
95
|
+
GW->>PNA: 事件通知(batch_id, summary, push_token)
|
|
96
|
+
PA->>PA: in_flight++, 启动 ack_timeout
|
|
97
|
+
PNA->>PNA: 验证 push_token ✓ → 发送平台推送
|
|
98
|
+
PNA->>GW: push.ack(batch_id)
|
|
99
|
+
GW->>PA: release(batch_id)
|
|
100
|
+
PA->>PA: in_flight--
|
|
101
|
+
else in_flight = max(背压)
|
|
102
|
+
PA->>PA: 排队等待槽位释放
|
|
103
|
+
else 频控抑制
|
|
104
|
+
PA->>PA: 延迟到下一窗口
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
GW-->>A: ack(msg_id, seq)
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 5. 背压与 in-flight 控制
|
|
114
|
+
|
|
115
|
+
```mermaid
|
|
116
|
+
stateDiagram-v2
|
|
117
|
+
[*] --> Idle: 初始状态
|
|
118
|
+
Idle --> Sending: 有待推送 & in_flight < max
|
|
119
|
+
Sending --> WaitAck: 事件已发出, in_flight++
|
|
120
|
+
WaitAck --> Idle: 收到 push.ack, in_flight--
|
|
121
|
+
WaitAck --> Idle: ack_timeout 超时, in_flight--
|
|
122
|
+
WaitAck --> Queued: 新推送到达但 in_flight = max
|
|
123
|
+
Queued --> Sending: 槽位释放
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 参数
|
|
127
|
+
|
|
128
|
+
| 参数 | 默认值 | 说明 |
|
|
129
|
+
|------|--------|------|
|
|
130
|
+
| max_in_flight | 1 | 同一 push_notify_aid 未确认批次上限(串行) |
|
|
131
|
+
| ack_timeout | 30s | 超时未 ack 自动释放槽位 |
|
|
132
|
+
| batch_size | 50 | 每批最多聚合多少个 target_aid 的通知 |
|
|
133
|
+
|
|
134
|
+
### 行为规则
|
|
135
|
+
|
|
136
|
+
- in_flight < max → 发送事件,in_flight++
|
|
137
|
+
- in_flight = max → 排队等待
|
|
138
|
+
- 收到 `push.ack(batch_id)` → in_flight--,触发队列中下一批
|
|
139
|
+
- 超时 → in_flight--,**不重试**(推送是 best-effort,过时推送是噪音)
|
|
140
|
+
- push_notify_aid 离线 → 事件丢弃,in_flight 不增加
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 6. 在线判断规则
|
|
145
|
+
|
|
146
|
+
```mermaid
|
|
147
|
+
flowchart TD
|
|
148
|
+
A[消息到达,目标 AID = B] --> B{B 的在线设备数 > 0?}
|
|
149
|
+
B -->|≥ 1 台在线| C[投递到在线 session,不推送]
|
|
150
|
+
B -->|0 台在线| D{push_config 存在?}
|
|
151
|
+
D -->|是| F[进入 PushAggregator]
|
|
152
|
+
D -->|否| G[仅持久化,等对方上线 pull]
|
|
153
|
+
F --> H[聚合 + 频控 + 背压 → 推送]
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**边界情况:**
|
|
157
|
+
|
|
158
|
+
- 目标 AID 上线瞬间:清空该 AID 的聚合桶,取消待发推送
|
|
159
|
+
- 最后一台设备断连:不立即触发推送,只有后续新消息到达时发现全离线才走推送路径
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 7. 跨域推送
|
|
164
|
+
|
|
165
|
+
**核心原则:推送由目标 AID 所属域的 Gateway 触发。**
|
|
166
|
+
|
|
167
|
+
发送方域不感知目标域的 push_config 和白名单,也不需要任何跨域配置同步。
|
|
168
|
+
|
|
169
|
+
```mermaid
|
|
170
|
+
sequenceDiagram
|
|
171
|
+
participant A as alice.domain-a.com
|
|
172
|
+
participant GW_A as Gateway A
|
|
173
|
+
participant GW_B as Gateway B
|
|
174
|
+
participant PA_B as PushAggregator B
|
|
175
|
+
participant PNA as push.domain-b.com<br/>(连在 GW_B)
|
|
176
|
+
|
|
177
|
+
A->>GW_A: message.send(to=bob.domain-b.com)
|
|
178
|
+
GW_A->>GW_A: 持久化消息
|
|
179
|
+
GW_A->>GW_B: 跨域 relay 消息
|
|
180
|
+
GW_B->>GW_B: 查询 bob 本地在线状态
|
|
181
|
+
|
|
182
|
+
alt bob 在本域有设备在线
|
|
183
|
+
GW_B->>GW_B: 投递到 bob 的在线 session
|
|
184
|
+
else bob 本域全部离线
|
|
185
|
+
GW_B->>PA_B: enqueue(target=bob, from=alice.domain-a.com)
|
|
186
|
+
PA_B->>GW_B: event/push.offline_message
|
|
187
|
+
GW_B->>PNA: 事件通知
|
|
188
|
+
PNA->>GW_B: push.ack
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
GW_B-->>GW_A: relay ack
|
|
192
|
+
GW_A-->>A: ack
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**规则:**
|
|
196
|
+
|
|
197
|
+
| 关注点 | 行为 |
|
|
198
|
+
|--------|------|
|
|
199
|
+
| 推送配置存储 | 仅存于目标 AID 所属域,不跨域同步 |
|
|
200
|
+
| 白名单管理 | 各域独立配置 `allowed_notify_aids`,互不影响 |
|
|
201
|
+
| push_notify_aid 必须连接位置 | 目标 AID 所属域的 Gateway |
|
|
202
|
+
| push_notify_aid 跨域时 | 不支持。push_notify_aid 必须与其服务的 AID 同域 |
|
|
203
|
+
| summary.senders 中的跨域 AID | 保留完整 AID(含域名),如 `alice.domain-a.com` |
|
|
204
|
+
|
|
205
|
+
**约束:** push_notify_aid 必须与其服务的目标 AID 处于同一域。如果应用希望在多个域提供推送服务,需要在每个域部署独立的 push_notify_aid 并分别加入白名单。
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 8. 聚合与频控
|
|
210
|
+
|
|
211
|
+
### 8.1 PushAggregator 数据结构
|
|
212
|
+
|
|
213
|
+
每个离线目标 AID 一个聚合桶:
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
bucket[target_aid] = {
|
|
217
|
+
push_notify_aid: "push.myapp.com",
|
|
218
|
+
push_token: "eyJhb...",
|
|
219
|
+
pending: [{from, msg_id, ts}, ...],
|
|
220
|
+
first_enqueue_ts: timestamp,
|
|
221
|
+
last_push_ts: timestamp,
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### 8.2 去重规则
|
|
226
|
+
|
|
227
|
+
同一 target_aid 在频控窗口内只产生一次推送通知。具体行为:
|
|
228
|
+
|
|
229
|
+
- 首条消息触发推送后,该 target_aid 进入频控冷却期(默认 60s)
|
|
230
|
+
- 冷却期内新消息只更新聚合桶的 summary(unread_count++、senders 去重追加),不产生新推送
|
|
231
|
+
- 冷却期结束时,若桶内有新增未推送内容,合并为一条推送发出
|
|
232
|
+
|
|
233
|
+
效果:无论短时间内收到多少条消息,target_aid 最多每 60s 收到一次推送通知,且 summary 是累积聚合的。
|
|
234
|
+
|
|
235
|
+
### 8.3 触发规则
|
|
236
|
+
|
|
237
|
+
| 规则 | 说明 | 默认值 |
|
|
238
|
+
|------|------|--------|
|
|
239
|
+
| 首条即推 | 桶为空且不在冷却期时,第一条消息立即触发 | 开启 |
|
|
240
|
+
| 窗口聚合 | 首条之后的消息等待窗口合并 | 5 秒 |
|
|
241
|
+
| 数量上限 | 桶内积累 N 条立即触发(不等窗口) | 20 条 |
|
|
242
|
+
|
|
243
|
+
### 8.4 频控规则
|
|
244
|
+
|
|
245
|
+
| 维度 | 限制 | 说明 |
|
|
246
|
+
|------|------|------|
|
|
247
|
+
| 同一 target_aid | 60 秒内最多 1 次推送 | 避免终端刷屏 |
|
|
248
|
+
| 同一 push_notify_aid | 1000 次/分钟 | 保护推送代理服务 |
|
|
249
|
+
| 全局 | 5000 次/分钟 | 系统保护 |
|
|
250
|
+
|
|
251
|
+
频控被触发时消息不丢弃,等窗口过后下一次聚合时一并推送。
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## 9. 协议字段
|
|
256
|
+
|
|
257
|
+
### 9.1 connect 扩展字段
|
|
258
|
+
|
|
259
|
+
```json
|
|
260
|
+
{
|
|
261
|
+
"method": "auth.login",
|
|
262
|
+
"params": {
|
|
263
|
+
"aid": "bob.example.com",
|
|
264
|
+
"challenge_response": "...",
|
|
265
|
+
"push_notify_aid": "push.myapp.com",
|
|
266
|
+
"push_token": "eyJhbGciOiJIUzI1NiJ9..."
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
- `push_notify_aid` 和 `push_token` 均为可选字段
|
|
272
|
+
- 两者必须同时提供或同时不提供
|
|
273
|
+
- 不提供 = 不需要离线推送
|
|
274
|
+
- 每次 connect 覆盖写(最新连接为准)
|
|
275
|
+
|
|
276
|
+
### 9.2 事件通知格式
|
|
277
|
+
|
|
278
|
+
Gateway 向 push_notify_aid 下发的事件通知:
|
|
279
|
+
|
|
280
|
+
```json
|
|
281
|
+
{
|
|
282
|
+
"method": "event/push.offline_message",
|
|
283
|
+
"params": {
|
|
284
|
+
"batch_id": "uuid-xxx",
|
|
285
|
+
"items": [
|
|
286
|
+
{
|
|
287
|
+
"target_aid": "bob.example.com",
|
|
288
|
+
"push_token": "eyJhbGciOiJIUzI1NiJ9...",
|
|
289
|
+
"summary": {
|
|
290
|
+
"unread_count": 3,
|
|
291
|
+
"senders": ["alice.example.com", "charlie.example.com"],
|
|
292
|
+
"latest_ts": 1716100005,
|
|
293
|
+
"group_ids": ["group-uuid-1"]
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
]
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
**安全约束:** 不包含消息正文。E2EE 场景下 Gateway 无法解密,推送代理只需知道"有 N 条未读来自谁"即可构造推送文案。
|
|
302
|
+
|
|
303
|
+
### 9.3 push.ack RPC
|
|
304
|
+
|
|
305
|
+
push_notify_aid 处理完一批推送后回调确认:
|
|
306
|
+
|
|
307
|
+
```json
|
|
308
|
+
{
|
|
309
|
+
"method": "push.ack",
|
|
310
|
+
"params": {
|
|
311
|
+
"batch_id": "uuid-xxx"
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
Gateway 收到后释放 in-flight 槽位,触发下一批。
|
|
317
|
+
|
|
318
|
+
### 9.4 push.update_config RPC(可选)
|
|
319
|
+
|
|
320
|
+
允许客户端在不重连的情况下更新推送配置:
|
|
321
|
+
|
|
322
|
+
```json
|
|
323
|
+
{
|
|
324
|
+
"method": "push.update_config",
|
|
325
|
+
"params": {
|
|
326
|
+
"push_notify_aid": "push.myapp.com",
|
|
327
|
+
"push_token": "new-token..."
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## 10. push_token 鉴权模型
|
|
335
|
+
|
|
336
|
+
### 10.1 push_notify_aid 白名单
|
|
337
|
+
|
|
338
|
+
Gateway 配置允许的 push_notify_aid 白名单,只有白名单内的 AID 才能被设置为推送代理:
|
|
339
|
+
|
|
340
|
+
- 客户端 connect 时携带的 `push_notify_aid` 不在白名单内 → 忽略该字段,不报错,不存储
|
|
341
|
+
- 白名单为空 → 禁用推送功能
|
|
342
|
+
- 白名单配置在 Gateway 启动配置中,运行时不可动态修改
|
|
343
|
+
|
|
344
|
+
```json
|
|
345
|
+
{
|
|
346
|
+
"push": {
|
|
347
|
+
"allowed_notify_aids": [
|
|
348
|
+
"push.myapp.com",
|
|
349
|
+
"push.partner.com"
|
|
350
|
+
]
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### 10.2 token 透传模型
|
|
356
|
+
|
|
357
|
+
```mermaid
|
|
358
|
+
sequenceDiagram
|
|
359
|
+
participant PNA as push_notify_aid
|
|
360
|
+
participant GW as Gateway
|
|
361
|
+
|
|
362
|
+
Note over PNA,GW: push_token 生命周期
|
|
363
|
+
PNA->>PNA: 签发 push_token(格式/算法自定)
|
|
364
|
+
Note over GW: Gateway 存储 push_token(opaque bytes)
|
|
365
|
+
Note over GW: 不验签、不解析、不判断过期
|
|
366
|
+
GW->>PNA: event/push.offline_message(..., push_token="xxx")
|
|
367
|
+
PNA->>PNA: 自己验签 push_token
|
|
368
|
+
alt token 有效
|
|
369
|
+
PNA->>PNA: 执行推送
|
|
370
|
+
PNA->>GW: push.ack(batch_id)
|
|
371
|
+
else token 无效/过期
|
|
372
|
+
PNA->>PNA: 丢弃
|
|
373
|
+
PNA->>GW: push.ack(batch_id)
|
|
374
|
+
Note over PNA: 客户端下次 connect 带新 token
|
|
375
|
+
end
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
**职责划分:**
|
|
379
|
+
|
|
380
|
+
| 角色 | 职责 |
|
|
381
|
+
|------|------|
|
|
382
|
+
| push_notify_aid | 签发 token、验证 token、决定格式和有效期、处理后 ack |
|
|
383
|
+
| Gateway | 存储 token、透传 token、不解析不验证、管理 in-flight |
|
|
384
|
+
| Client | 向 push_notify_aid 申请 token、connect 时携带 |
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## 11. 持久化
|
|
389
|
+
|
|
390
|
+
### push_config 表
|
|
391
|
+
|
|
392
|
+
```sql
|
|
393
|
+
CREATE TABLE push_config (
|
|
394
|
+
aid VARCHAR(255) PRIMARY KEY,
|
|
395
|
+
push_notify_aid VARCHAR(255) NOT NULL,
|
|
396
|
+
push_token TEXT NOT NULL,
|
|
397
|
+
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
398
|
+
);
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
- 随 connect 写入/更新(UPSERT)
|
|
402
|
+
- 可加内存缓存(TTL 5 分钟)
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## 12. 边界情况
|
|
407
|
+
|
|
408
|
+
| 场景 | 处理 |
|
|
409
|
+
|------|------|
|
|
410
|
+
| push_notify_aid 离线 | 事件丢弃,不持久化。推送是 best-effort,消息可靠性由 pull 保证 |
|
|
411
|
+
| 目标 AID 未配置推送 | 不推送,消息正常持久化等对方上线 pull |
|
|
412
|
+
| 目标 AID 上线瞬间 | 清空聚合桶,取消待发推送 |
|
|
413
|
+
| E2EE 消息 | 推送内容只含元数据(发送者、数量),不含密文 |
|
|
414
|
+
| 群组消息 | 群内每个离线成员独立聚合,summary 含 group_ids |
|
|
415
|
+
| push_token 过期 | push_notify_aid 丢弃但仍 ack,客户端下次 connect 刷新 token |
|
|
416
|
+
| ack 超时 | 释放槽位,不重试。后续新消息触发新批次时会包含累积通知 |
|
|
417
|
+
| 同一 AID 多设备不同推送配置 | 以最后一次 connect 为准(单条记录覆盖) |
|
|
418
|
+
| 跨域消息推送 | 由目标 AID 所属域的 Gateway 触发,发送方域不参与 |
|
|
419
|
+
| push_notify_aid 跨域 | 不支持,必须与目标 AID 同域 |
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# AUN 协议规范
|
|
2
|
+
|
|
3
|
+
> AUN(Agent Union Network)— ACP 协议 2.0
|
|
4
|
+
>
|
|
5
|
+
> 版本:2.0 (草稿) | 日期:2026-03-23
|
|
6
|
+
|
|
7
|
+
## 概述
|
|
8
|
+
|
|
9
|
+
AUN 是 ACP 协议的 2.0 版本,采用 WebSocket + JSON-RPC 2.0 定义 Agent 间安全通信的标准接口。协议采用**主协议 + 子协议**架构,支持三种平级连接模式:`gateway`、`peer`、`relay`。
|
|
10
|
+
|
|
11
|
+
**核心特性**:
|
|
12
|
+
- 基于 AID(Agent Identifier)的去中心化身份体系,X.509 证书链信任模型
|
|
13
|
+
- 身份与拓扑解耦:`auth.*` 管身份凭证,`peer.*`/`relay.*`/Gateway 各管连接
|
|
14
|
+
- 业务层方法拓扑无关:认证完成后,`message.*` 等方法在三种模式下统一使用
|
|
15
|
+
- 四层协议架构:安全层 → 通信层 → 协议层 → 服务层
|
|
16
|
+
|
|
17
|
+
## 文档索引
|
|
18
|
+
|
|
19
|
+
### 主协议
|
|
20
|
+
|
|
21
|
+
| 文档 | 内容 |
|
|
22
|
+
|------|------|
|
|
23
|
+
| [00-总览与分层.md](00-总览与分层.md) | 协议目标、核心原则、四层架构、三种连接模式总览、文档导航 |
|
|
24
|
+
| [02-证书与信任体系.md](02-证书与信任体系.md) | AID 身份、四级证书链、信任模型、吊销机制(CRL/OCSP)、CT 概述 |
|
|
25
|
+
| [09-安全考虑.md](09-安全考虑.md) | 威胁模型、防护措施、责任边界、连接升级安全、验签时序 |
|
|
26
|
+
|
|
27
|
+
### 子协议
|
|
28
|
+
|
|
29
|
+
| 文档 | 命名空间 | 内容 |
|
|
30
|
+
|------|---------|------|
|
|
31
|
+
| [01-身份与凭证协议-auth.md](01-身份与凭证协议-auth.md) | `auth.*` | AID 创建、两阶段登录、证书生命周期、JWT Token 机制 |
|
|
32
|
+
| [03-Gateway-连接模式.md](03-Gateway-连接模式.md) | `auth.connect` | Gateway 模式连接流程、auth.connect 握手、心跳重连 |
|
|
33
|
+
| [04-Peer-子协议.md](04-Peer-子协议.md) | `peer.*` | 对等认证四步握手、证书链验证、nonce 签名规则 |
|
|
34
|
+
| [05-Relay-子协议.md](05-Relay-子协议.md) | `relay.*` | 中继注册与转发、透明封装、与 peer.* 的关系 |
|
|
35
|
+
|
|
36
|
+
### 业务层与公共基础
|
|
37
|
+
|
|
38
|
+
| 文档 | 内容 |
|
|
39
|
+
|------|------|
|
|
40
|
+
| [06-服务协议.md](06-服务协议.md) | 业务层方法:message.* / meta.* / search.* / task.* / 跨域消息路由 / E2EE 摘要 / `pki.{issuer}` 与 `ct.{issuer}` 公开端点 |
|
|
41
|
+
| [07-错误码与状态机.md](07-错误码与状态机.md) | 错误码分层汇总、各模式状态机、可重试/不可重试分类 |
|
|
42
|
+
| [08-AUN-E2EE.md](08-AUN-E2EE.md) | 端到端加密安全层:密文格式、签名、防重放、prekey 管理(横跨三种模式) |
|
|
43
|
+
| [08-AUN-E2EE-Group.md](08-AUN-E2EE-Group.md) | 群组 E2EE:Epoch Group Key、Membership Commitment、密钥分发与恢复 |
|
|
44
|
+
|
|
45
|
+
### 附录
|
|
46
|
+
|
|
47
|
+
| 附录 | 文件 | 内容 |
|
|
48
|
+
|------|------|------|
|
|
49
|
+
| A | [附录A-术语表.md](附录A-术语表.md) | 核心术语、命名规范 |
|
|
50
|
+
| B | [附录B-扩展性指南.md](附录B-扩展性指南.md) | 可选命名空间、自定义协议 |
|
|
51
|
+
| C | [附录C-私钥管理与身份恢复.md](附录C-私钥管理与身份恢复.md) | 私钥管理、社交恢复 |
|
|
52
|
+
| D | [附录D-Root_CA_治理机制.md](附录D-Root_CA_治理机制.md) | 根证书管理局治理、CT 通用模型 |
|
|
53
|
+
| E | [附录E-Root_CA_准入流程.md](附录E-Root_CA_准入流程.md) | Root CA 准入流程 |
|
|
54
|
+
| F | [附录F-Issuer_CA_申请流程.md](附录F-Issuer_CA_申请流程.md) | Issuer CA 证书申请、Issuer CT 服务要求 |
|
|
55
|
+
| G | [附录G-AID_孤儿预防与救援机制.md](附录G-AID_孤儿预防与救援机制.md) | 孤儿 AID 预防与救援 |
|
|
56
|
+
| H | [附录H-Identity服务实现指南.md](附录H-Identity服务实现指南.md) | Auth 服务实现 |
|
|
57
|
+
| I | [附录I-跨域消息路由实现指南.md](附录I-跨域消息路由实现指南.md) | 跨域消息路由实现 |
|
|
58
|
+
| J | [附录J-客户端接入示例.md](附录J-客户端接入示例.md) | 客户端接入示例 |
|
|
59
|
+
| K | [附录K-Agent_Web发现协议.md](附录K-Agent_Web发现协议.md) | Agent Web 发现协议 |
|
|
60
|
+
| L | [附录L-E2EE实现指南.md](附录L-E2EE实现指南.md) | E2EE 实现指南 |
|
|
61
|
+
| M | [附录M-JWT认证实现指南.md](附录M-JWT认证实现指南.md) | JWT 认证实现指南 |
|
|
62
|
+
|
|
63
|
+
## 快速导航
|
|
64
|
+
|
|
65
|
+
**接入开发者**:[00-总览](00-总览与分层.md) → [01-auth](01-身份与凭证协议-auth.md) → [03-Gateway](03-Gateway-连接模式.md) → [附录J](附录J-客户端接入示例.md)
|
|
66
|
+
|
|
67
|
+
**协议实现者**:[02-证书体系](02-证书与信任体系.md) → [01-auth](01-身份与凭证协议-auth.md) → [04-Peer](04-Peer-子协议.md) → [06-服务协议](06-服务协议.md) → [07-错误码](07-错误码与状态机.md)
|
|
68
|
+
|
|
69
|
+
**安全审计**:[02-证书体系](02-证书与信任体系.md) → [09-安全考虑](09-安全考虑.md) → [AUN-E2EE](08-AUN-E2EE.md)
|
|
70
|
+
|
|
71
|
+
**SDK 设计**:[00-总览](00-总览与分层.md) → [06-服务协议](06-服务协议.md) → [AUN-SDK-跨语言设计方案](../../AUN-SDK-跨语言设计方案.md)
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Agent.md 规格定义
|
|
2
|
+
|
|
3
|
+
版本: 1.0.0
|
|
4
|
+
|
|
5
|
+
## 限制
|
|
6
|
+
|
|
7
|
+
- **文件大小**: 最大 4KB
|
|
8
|
+
|
|
9
|
+
## 文件格式
|
|
10
|
+
|
|
11
|
+
agent.md 文件采用 YAML frontmatter + Markdown 内容的格式:
|
|
12
|
+
|
|
13
|
+
```markdown
|
|
14
|
+
---
|
|
15
|
+
# YAML 元数据 (核心字段)
|
|
16
|
+
aid: "agent-name.aid.pub"
|
|
17
|
+
name: "Agent Name"
|
|
18
|
+
type: "assistant"
|
|
19
|
+
version: "1.0.0"
|
|
20
|
+
description: "一句话描述"
|
|
21
|
+
tags:
|
|
22
|
+
- tag1
|
|
23
|
+
- tag2
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Markdown 正文内容
|
|
27
|
+
详细说明、Skills、使用示例等...
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## YAML Schema (核心字段)
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
# ===== 身份标识 (必填) =====
|
|
34
|
+
aid:
|
|
35
|
+
type: string
|
|
36
|
+
required: true
|
|
37
|
+
pattern: "^[a-zA-Z0-9_-]+\\.aid\\.pub$"
|
|
38
|
+
description: "Agent 的唯一身份标识 (AID 格式)"
|
|
39
|
+
example: "lobster.aid.pub"
|
|
40
|
+
|
|
41
|
+
# ===== 基本信息 =====
|
|
42
|
+
name:
|
|
43
|
+
type: string
|
|
44
|
+
required: true
|
|
45
|
+
description: "Agent 显示名称"
|
|
46
|
+
example: "Code Reviewer"
|
|
47
|
+
|
|
48
|
+
type:
|
|
49
|
+
type: string
|
|
50
|
+
required: true
|
|
51
|
+
enum:
|
|
52
|
+
- human # 真人用户
|
|
53
|
+
- assistant # 通用助手
|
|
54
|
+
- avatar # 用户化身/分身
|
|
55
|
+
- openclaw # OpenClaw AI 助手
|
|
56
|
+
- codeagent # 代码编程 Agent
|
|
57
|
+
description: "Agent 类型"
|
|
58
|
+
|
|
59
|
+
version:
|
|
60
|
+
type: string
|
|
61
|
+
required: true
|
|
62
|
+
pattern: "^\\d+\\.\\d+\\.\\d+$"
|
|
63
|
+
example: "1.0.0"
|
|
64
|
+
|
|
65
|
+
# ===== 描述信息 =====
|
|
66
|
+
description:
|
|
67
|
+
type: string
|
|
68
|
+
required: true
|
|
69
|
+
max_length: 100
|
|
70
|
+
description: "一句话简介,用于列表展示"
|
|
71
|
+
|
|
72
|
+
# ===== 标签 =====
|
|
73
|
+
tags:
|
|
74
|
+
type: array
|
|
75
|
+
required: false
|
|
76
|
+
items:
|
|
77
|
+
type: string
|
|
78
|
+
description: "用于分类和检索"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Agent Type 说明
|
|
82
|
+
|
|
83
|
+
| Type | 用途 | 示例 |
|
|
84
|
+
|------|------|------|
|
|
85
|
+
| `human` | 真人用户 | 开发者、管理员、终端用户 |
|
|
86
|
+
| `assistant` | 通用对话助手 | 聊天机器人、客服 |
|
|
87
|
+
| `avatar` | 用户分身 | 代表用户行动的 agent |
|
|
88
|
+
| `openclaw` | OpenClaw AI 助手 | 本地个人助手、ACP 桥接 |
|
|
89
|
+
| `codeagent` | 代码编程 Agent | Claude Code、Cursor Agent |
|
|
90
|
+
|
|
91
|
+
## 示例文件
|
|
92
|
+
|
|
93
|
+
| 文件 | Type | AID | 说明 |
|
|
94
|
+
|------|------|-----|------|
|
|
95
|
+
| [human-developer.md](examples/human-developer.md) | `human` | `zhangsan.aid.pub` | 全栈开发者 |
|
|
96
|
+
| [openclaw-lobster.md](examples/openclaw-lobster.md) | `openclaw` | `lobster.aid.pub` | OpenClaw AI 助手 |
|
|
97
|
+
| [codeagent-claudecode.md](examples/codeagent-claudecode.md) | `codeagent` | `claudecode.aid.pub` | Claude Code 编程助手 |
|
|
98
|
+
|
|
99
|
+
## Markdown 部分建议内容
|
|
100
|
+
|
|
101
|
+
YAML 只保留核心元数据,详细信息放在 Markdown 部分:
|
|
102
|
+
|
|
103
|
+
- **Skills** - 技能/命令列表及说明
|
|
104
|
+
- **功能说明** - 详细的功能描述
|
|
105
|
+
- **使用示例** - 具体的使用方法
|
|
106
|
+
- **配置说明** - 运行时配置(如需要)
|
|
107
|
+
- **限制/注意事项** - 使用限制
|
|
108
|
+
|
|
109
|
+
## 解析方式
|
|
110
|
+
|
|
111
|
+
Go 中可以这样解析:
|
|
112
|
+
|
|
113
|
+
```go
|
|
114
|
+
parts := strings.SplitN(content, "---", 3)
|
|
115
|
+
// parts[0] = "" (空)
|
|
116
|
+
// parts[1] = YAML 内容
|
|
117
|
+
// parts[2] = Markdown 内容
|
|
118
|
+
```
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
aid: "claudecode.aid.pub"
|
|
3
|
+
name: "Claude Code"
|
|
4
|
+
type: "codeagent"
|
|
5
|
+
version: "1.0.0"
|
|
6
|
+
description: "Anthropic 官方代码助手,终端内的 AI 编程伙伴"
|
|
7
|
+
|
|
8
|
+
tags:
|
|
9
|
+
- coding
|
|
10
|
+
- terminal
|
|
11
|
+
- anthropic
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Claude Code
|
|
15
|
+
|
|
16
|
+
Anthropic 官方 agentic 编码工具,运行在终端中,理解整个代码库,通过自然语言帮助你更快地编程。
|
|
17
|
+
|
|
18
|
+
## Skills
|
|
19
|
+
|
|
20
|
+
- `/review` - 代码审查与改进建议
|
|
21
|
+
- `/commit` - 智能 Git 提交
|
|
22
|
+
- `/pr` - 创建 Pull Request
|
|
23
|
+
- `/test` - 运行和编写测试
|
|
24
|
+
- `/explain` - 解释复杂代码逻辑
|
|
25
|
+
- `/refactor` - 代码重构
|
|
26
|
+
|
|
27
|
+
## 核心能力
|
|
28
|
+
|
|
29
|
+
- **代码库理解**: Agentic 搜索,无需手动选择上下文
|
|
30
|
+
- **多文件编辑**: 理解依赖关系,执行跨文件修改
|
|
31
|
+
- **Git 工作流**: 读取 Issue、编写代码、运行测试、提交 PR
|
|
32
|
+
- **Extended Thinking**: 复杂问题深度推理后再响应
|
|
33
|
+
- **MCP 支持**: 集成 Figma、Jira、GitHub 等工具
|
|
34
|
+
|
|
35
|
+
## IDE 集成
|
|
36
|
+
|
|
37
|
+
- VS Code / Cursor / Windsurf 原生扩展
|
|
38
|
+
- JetBrains 全系列支持
|
|
39
|
+
- 可视化 diff 展示修改
|
|
40
|
+
|
|
41
|
+
## 高级特性
|
|
42
|
+
|
|
43
|
+
- **Subagents**: 自定义子 Agent (code-reviewer, debugger)
|
|
44
|
+
- **Hooks**: PreToolUse, PostToolUse, Notification, Stop
|
|
45
|
+
- **Session 管理**: 自动保存对话历史和工具状态
|
|
46
|
+
- **自定义 Slash Commands**: 创建常用 prompt 快捷方式
|
|
47
|
+
|
|
48
|
+
## 兴趣方向
|
|
49
|
+
|
|
50
|
+
- 测试驱动开发
|
|
51
|
+
- 复杂调试会话
|
|
52
|
+
- UI 代码快速迭代
|
|
53
|
+
- 多文件重构
|
|
54
|
+
|
|
55
|
+
## 安装
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm install -g @anthropic-ai/claude-code
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
需要 Node.js 18+ 和 Claude Pro/Max/Team/Enterprise 订阅。
|