@agentunion/fastaun-browser 0.5.4 → 0.5.8
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 +177 -67
- package/_packed_docs/AUN/347/246/273/347/272/277/346/216/250/351/200/201/346/216/245/345/205/245/344/270/216/346/274/224/347/244/272/346/214/207/345/215/227.md +290 -0
- package/_packed_docs/AUN/347/246/273/347/272/277/346/216/250/351/200/201/346/234/215/345/212/241/346/236/266/346/236/204/344/270/216/350/257/246/347/273/206/345/256/236/347/216/260/350/256/241/345/210/222-codex.md +994 -0
- package/_packed_docs/AUN/347/246/273/347/272/277/346/216/250/351/200/201/346/234/215/345/212/241/350/277/220/347/273/264/344/270/216/345/217/221/345/270/203/346/214/207/345/215/227.md +144 -0
- package/_packed_docs/CHANGELOG.md +177 -67
- package/_packed_docs/INDEX.md +124 -65
- package/_packed_docs/KITE_DOCS_GUIDE.md +65 -30
- package/_packed_docs/agent.md/SCHEMA.md +83 -58
- package/_packed_docs/agent.md/examples/codeagent-claudecode.md +1 -1
- package/_packed_docs/agent.md/examples/openclaw-lobster.md +1 -1
- package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +1 -1
- package/_packed_docs/audit/AUN/346/234/215/345/212/241Go/345/214/226/351/207/215/346/236/204/347/262/276/347/273/206/345/214/226/346/272/220/347/240/201/345/256/241/346/237/245-20260718.md +366 -0
- package/_packed_docs/aun/345/205/254/347/275/221/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +234 -0
- package/_packed_docs/aun/345/210/206/345/270/203/345/274/217/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +1095 -0
- package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +1199 -0
- package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +6 -4
- package/_packed_docs/group-message-rpc-alignment-gaps.md +741 -0
- package/_packed_docs/message-online-push-alignment.md +572 -0
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +58 -20
- package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +219 -247
- package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +14 -14
- package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +3 -3
- 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 +165 -421
- package/_packed_docs/protocol/README.md +1 -0
- package/_packed_docs/protocol/aun-docs-guide.md +7 -4
- package/_packed_docs/protocol/index.md +25 -19
- package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +63 -18
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +22 -0
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +93 -84
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +6 -2
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +73 -34
- package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +3 -3
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +21 -9
- package/_packed_docs/sdk/09-group-rpc-manual.md +319 -285
- package/_packed_docs/sdk/09-message-rpc-manual.md +144 -103
- package/_packed_docs/sdk/09-payload-reference.md +1 -1
- package/_packed_docs/sdk/09-storage-rpc-manual.md +14 -3
- package/_packed_docs/sdk/09-stream-rpc-manual.md +8 -8
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +34 -23
- package/_packed_docs/sdk/CHANGELOG-0.5.6.md +73 -0
- package/_packed_docs/sdk/INDEX.md +45 -37
- package/_packed_docs/sdk/README.md +11 -9
- package/_packed_docs//345/217/221/345/270/203/346/212/245/345/221/212-0.5.6.md +260 -0
- package/_packed_docs//346/266/210/346/201/257/345/220/214/346/255/245/344/270/216/345/216/206/345/217/262/346/213/211/345/217/226/344/273/243/347/240/201/345/256/241/346/237/245/351/227/256/351/242/230/346/270/205/345/215/225.md +229 -0
- package/_packed_docs//346/266/210/346/201/257/345/220/214/346/255/245/344/270/216/345/216/206/345/217/262/346/213/211/345/217/226/346/224/271/351/200/240/346/226/271/346/241/210.md +750 -0
- package/dist/agent-md-schema.d.ts +14 -0
- package/dist/agent-md-schema.d.ts.map +1 -0
- package/dist/agent-md-schema.js +103 -0
- package/dist/agent-md-schema.js.map +1 -0
- package/dist/agent-md.d.ts +11 -5
- package/dist/agent-md.d.ts.map +1 -1
- package/dist/agent-md.js +295 -53
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +7 -7
- package/dist/aid-store.d.ts.map +1 -1
- package/dist/aid-store.js +46 -18
- package/dist/aid-store.js.map +1 -1
- package/dist/aid.d.ts +2 -0
- package/dist/aid.d.ts.map +1 -1
- package/dist/aid.js +29 -7
- package/dist/aid.js.map +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +31 -11
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +29920 -19719
- package/dist/cert-utils.d.ts +1 -0
- package/dist/cert-utils.d.ts.map +1 -1
- package/dist/cert-utils.js +36 -16
- package/dist/cert-utils.js.map +1 -1
- package/dist/client/delivery.d.ts +106 -11
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js +1925 -374
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/group-state.d.ts.map +1 -1
- package/dist/client/group-state.js +27 -24
- package/dist/client/group-state.js.map +1 -1
- package/dist/client/lifecycle.d.ts +15 -1
- package/dist/client/lifecycle.d.ts.map +1 -1
- package/dist/client/lifecycle.js +477 -132
- package/dist/client/lifecycle.js.map +1 -1
- package/dist/client/mention-mode.d.ts +7 -0
- package/dist/client/mention-mode.d.ts.map +1 -0
- package/dist/client/mention-mode.js +184 -0
- package/dist/client/mention-mode.js.map +1 -0
- package/dist/client/peers.d.ts +1 -1
- package/dist/client/peers.d.ts.map +1 -1
- package/dist/client/peers.js +26 -3
- package/dist/client/peers.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts +34 -2
- package/dist/client/rpc-pipeline.d.ts.map +1 -1
- package/dist/client/rpc-pipeline.js +503 -99
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/runtime.d.ts +1 -3
- package/dist/client/runtime.d.ts.map +1 -1
- package/dist/client/runtime.js +4 -7
- package/dist/client/runtime.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts +43 -2
- package/dist/client/v2-e2ee.d.ts.map +1 -1
- package/dist/client/v2-e2ee.js +931 -138
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +46 -15
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +785 -304
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +4 -1
- package/dist/errors.js.map +1 -1
- package/dist/facades.d.ts +26 -1
- package/dist/facades.d.ts.map +1 -1
- package/dist/facades.js +142 -60
- package/dist/facades.js.map +1 -1
- package/dist/group-id.d.ts.map +1 -1
- package/dist/group-id.js +2 -17
- package/dist/group-id.js.map +1 -1
- package/dist/group-index.d.ts +6 -1
- package/dist/group-index.d.ts.map +1 -1
- package/dist/group-index.js +44 -25
- package/dist/group-index.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/keystore/index.d.ts +10 -5
- package/dist/keystore/index.d.ts.map +1 -1
- package/dist/keystore/indexeddb-identity-store.d.ts +0 -12
- package/dist/keystore/indexeddb-identity-store.d.ts.map +1 -1
- package/dist/keystore/indexeddb-identity-store.js +0 -60
- package/dist/keystore/indexeddb-identity-store.js.map +1 -1
- package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
- package/dist/keystore/indexeddb-shared.js +9 -5
- package/dist/keystore/indexeddb-shared.js.map +1 -1
- package/dist/keystore/indexeddb-token-store.d.ts +3 -1
- package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
- package/dist/keystore/indexeddb-token-store.js +47 -2
- package/dist/keystore/indexeddb-token-store.js.map +1 -1
- package/dist/register-flow.d.ts.map +1 -1
- package/dist/register-flow.js +28 -3
- package/dist/register-flow.js.map +1 -1
- package/dist/seq-tracker.d.ts +28 -8
- package/dist/seq-tracker.d.ts.map +1 -1
- package/dist/seq-tracker.js +224 -61
- package/dist/seq-tracker.js.map +1 -1
- package/dist/storage/vfs.d.ts +1 -0
- package/dist/storage/vfs.d.ts.map +1 -1
- package/dist/storage/vfs.js +26 -2
- package/dist/storage/vfs.js.map +1 -1
- package/dist/tools/cross-sdk-agent.js +399 -11
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.d.ts +12 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +226 -102
- package/dist/transport.js.map +1 -1
- package/dist/v2/session/session.d.ts.map +1 -1
- package/dist/v2/session/session.js +3 -4
- package/dist/v2/session/session.js.map +1 -1
- package/dist/v2/state/commitment.d.ts.map +1 -1
- package/dist/v2/state/commitment.js +1 -2
- package/dist/v2/state/commitment.js.map +1 -1
- package/dist/validators.d.ts.map +1 -1
- package/dist/validators.js +8 -14
- package/dist/validators.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +11 -9
- package/dist/group-resources.d.ts +0 -98
- package/dist/group-resources.d.ts.map +0 -1
- package/dist/group-resources.js +0 -635
- package/dist/group-resources.js.map +0 -1
- package/dist/keystore/indexeddb.d.ts +0 -179
- package/dist/keystore/indexeddb.d.ts.map +0 -1
- package/dist/keystore/indexeddb.js +0 -2031
- package/dist/keystore/indexeddb.js.map +0 -1
- package/dist/namespaces/auth.d.ts +0 -98
- package/dist/namespaces/auth.d.ts.map +0 -1
- package/dist/namespaces/auth.js +0 -992
- package/dist/namespaces/auth.js.map +0 -1
- package/dist/namespaces/custody.d.ts +0 -51
- package/dist/namespaces/custody.d.ts.map +0 -1
- package/dist/namespaces/custody.js +0 -302
- package/dist/namespaces/custody.js.map +0 -1
- package/dist/namespaces/meta.d.ts +0 -109
- package/dist/namespaces/meta.d.ts.map +0 -1
- package/dist/namespaces/meta.js +0 -549
- package/dist/namespaces/meta.js.map +0 -1
|
@@ -16,13 +16,14 @@
|
|
|
16
16
|
| 05 | [05-Relay-子协议.md](05-Relay-子协议.md) | `relay.*` 中继注册转发、透明封装、与 peer.* 关系 |
|
|
17
17
|
| 06 | [06-服务协议.md](06-服务协议.md) | 业务层:message.* / meta.* / search.* / task.* / group.* + 跨域消息路由 |
|
|
18
18
|
| 07 | [07-错误码与状态机.md](07-错误码与状态机.md) | 错误码汇总、各模式状态机、重试分类 |
|
|
19
|
-
| E2EE | [08-AUN-E2EE.md](08-AUN-E2EE.md) | Legacy P2P E2EE 信封说明;当前默认主路径见 SDK V2 多设备 wrap 文档 |
|
|
19
|
+
| E2EE | [08-AUN-E2EE.md](08-AUN-E2EE.md) | Legacy P2P E2EE 信封说明;当前默认主路径见 SDK V2 多设备 wrap 文档 |
|
|
20
20
|
| E2EE-Group | [08-AUN-E2EE-Group.md](08-AUN-E2EE-Group.md) | 群组 E2EE V2:消息级密钥、逐设备密钥包裹、成员状态签名验证 |
|
|
21
21
|
| 09 | [09-安全考虑.md](09-安全考虑.md) | 威胁模型、防护措施、升级安全、验签时序 |
|
|
22
22
|
| 10 | [10-Group-子协议.md](10-Group-子协议.md) | `group.*` 群组管理、群消息、`group.index` 签名索引、邀请码、资源共享、在线状态 |
|
|
23
|
-
| 11 | [11-Storage-子协议.md](11-Storage-子协议.md) | `storage.*` 对象存储、大文件上传下载、预签名 URL |
|
|
24
|
-
| 12 | [12-Stream-子协议.md](12-Stream-子协议.md) | `stream.*` 实时流式传输、WebSocket 推流、HTTP SSE 拉流、跨域拉流 |
|
|
25
|
-
|
|
|
23
|
+
| 11 | [11-Storage-子协议.md](11-Storage-子协议.md) | `storage.*` 对象存储、大文件上传下载、预签名 URL |
|
|
24
|
+
| 12 | [12-Stream-子协议.md](12-Stream-子协议.md) | `stream.*` 实时流式传输、WebSocket 推流、HTTP SSE 拉流、跨域拉流 |
|
|
25
|
+
| 13 | [13-Agent行为规范.md](13-Agent行为规范.md) | Agent 自主模式行为规范、收发方义务、`mention_mode` 与 channel 层过滤边界 |
|
|
26
|
+
| 15 | [15-离线推送通知协议.md](15-离线推送通知协议.md) | `push.register/unregister/ack`、SDK connect 自动登记、installation delivery、持久恢复与安全边界 |
|
|
26
27
|
| 16 | [16-系统目录保护方案.md](16-系统目录保护方案.md) | `memberdata` 与 `group_data` 的系统目录保护、目录树隐藏/读下载/写保护边界、配额归属和访问矩阵 |
|
|
27
28
|
|
|
28
29
|
**附录**:A-术语表 | B-扩展性 | C-私钥管理 | D-Root CA 治理 | E-Root CA 准入 | F-Issuer CA 申请 | G-孤儿 AID | H-Auth 实现 | I-跨域消息路由 | J-客户端接入 | K-Agent Web | L-E2EE 实现 | M-JWT 实现
|
|
@@ -53,11 +54,13 @@
|
|
|
53
54
|
| 任务协作(task.*) | 06 §6.5 |
|
|
54
55
|
| 跨域消息路由 | 06 §6.7 |
|
|
55
56
|
| E2EE 端到端加密 | AUN-E2EE, 06 §6.6 |
|
|
56
|
-
| 群组管理(group.*) | 10 |
|
|
57
|
-
| 群索引(group.index / _meta.group_indexes / CAS) | 10 §10.13 |
|
|
57
|
+
| 群组管理(group.*) | 10 |
|
|
58
|
+
| 群索引(group.index / _meta.group_indexes / CAS) | 10 §10.13 |
|
|
58
59
|
| 群消息收发(group.send/pull) | 10 §10.6 |
|
|
59
|
-
| 群成员权限(owner/admin/member) | 10 §10.2 |
|
|
60
|
-
|
|
|
60
|
+
| 群成员权限(owner/admin/member) | 10 §10.2 |
|
|
61
|
+
| 群提及过滤(mention_mode) | 10 §10.2.3, 13 §13.8 |
|
|
62
|
+
| Agent 自主行为与响应义务 | 13 |
|
|
63
|
+
| 邀请码(group.create_invite_code) | 10 §10.7 |
|
|
61
64
|
| 群文件系统(group.fs.*) | 10 §10.9 |
|
|
62
65
|
| 系统目录保护(memberdata / group_data) | 16 |
|
|
63
66
|
| 对象存储(storage.*) | 11 |
|
|
@@ -66,11 +69,11 @@
|
|
|
66
69
|
| 拉流(HTTP SSE) | 12 §12.6 拉流端点 |
|
|
67
70
|
| 跨域拉流 | 12 §12.7 |
|
|
68
71
|
| 离线推送通知 | 15 |
|
|
69
|
-
| push_notify_aid 推送代理 | 15 §2
|
|
70
|
-
| push_token 鉴权 | 15 §10 |
|
|
71
|
-
|
|
|
72
|
-
| 推送去重与频控 | 15 §
|
|
73
|
-
|
|
|
72
|
+
| push_notify_aid 推送代理 | 15 §2-3 |
|
|
73
|
+
| push_token 鉴权 | 15 §3, §7, §10 |
|
|
74
|
+
| 推送 ACK、重试与恢复 | 15 §8-9 |
|
|
75
|
+
| 推送去重与频控 | 15 §7, §9 |
|
|
76
|
+
| federation 与域边界 | 15 §10 |
|
|
74
77
|
| 错误码 | 07 §7.1 |
|
|
75
78
|
| 连接状态机 | 07 §7.3 |
|
|
76
79
|
| 威胁模型与安全 | 09 |
|
|
@@ -100,13 +103,13 @@ Gateway 模式定位与职责、Gateway 发现机制、连接时序(auth.* →
|
|
|
100
103
|
`relay.*` 3 个方法:register、forward、event/relay.message。Relay 职责边界(零信任笨管道)、透明封装规则、与 peer.* 配合完成端到端认证。
|
|
101
104
|
|
|
102
105
|
### 06-服务协议(业务层)
|
|
103
|
-
认证后可用的业务方法:auth.*(身份管理)、ca.*(证书管理)、message.*(P2P 消息、E2EE V2 设备密钥/bootstrap、`payload.type` 负载类型)、meta.*(心跳、状态、受信根)、storage.*(文件存储)、group.*(群组)、mail.*(邮件)、stream.*(流式传输)、search.*(Agent 发现)、relay.*(中继)、peer.*(点对点)、task.*(协作任务)。同时列出 `pki.{issuer}` 与 `ct.{issuer}` 等公开 HTTP 端点入口。
|
|
106
|
+
认证后可用的业务方法:auth.*(身份管理)、ca.*(证书管理)、message.*(P2P 消息、E2EE V2 设备密钥/bootstrap、`payload.type` 负载类型)、meta.*(心跳、状态、受信根)、storage.*(文件存储)、group.*(群组)、mail.*(邮件)、stream.*(流式传输)、search.*(Agent 发现)、relay.*(中继)、peer.*(点对点)、task.*(协作任务)。同时列出 `pki.{issuer}` 与 `ct.{issuer}` 等公开 HTTP 端点入口。
|
|
104
107
|
|
|
105
108
|
### 07-错误码与状态机
|
|
106
109
|
错误码分层汇总(JSON-RPC 通用 + AUN 协议级 + Peer/Relay/Search/Task/升级扩展码)。三种连接模式状态机。任务状态机。可重试/不可重试分类。
|
|
107
110
|
|
|
108
111
|
### AUN-E2EE
|
|
109
|
-
独立安全层,横跨三种连接模式。当前 SDK 主路径为 E2EE V2 多设备 wrap:P2P 使用 `e2ee.p2p_encrypted`,Group 使用 `e2ee.group_encrypted`;正文一消息一密钥,按 recipient 设备生成 `3DH` / `1DH` wrap,并由接收端验证 `sender_signature`、AAD 和 recipient proof / digest。旧 `prekey_ecdh_v2` / `long_term_key` 文档仅作为历史兼容材料保留。
|
|
112
|
+
独立安全层,横跨三种连接模式。当前 SDK 主路径为 E2EE V2 多设备 wrap:P2P 使用 `e2ee.p2p_encrypted`,Group 使用 `e2ee.group_encrypted`;正文一消息一密钥,按 recipient 设备生成 `3DH` / `1DH` wrap,并由接收端验证 `sender_signature`、AAD 和 recipient proof / digest。旧 `prekey_ecdh_v2` / `long_term_key` 文档仅作为历史兼容材料保留。
|
|
110
113
|
|
|
111
114
|
### AUN-E2EE-Group
|
|
112
115
|
群组端到端加密规范(V2,当前唯一在用版本)。每条消息使用独立随机密钥,接收方按设备分别持有密钥包裹(wrap),不依赖群级共享对称密钥。成员状态通过签名版本链(state_version/state_chain)记录,接收方可据此检测状态分叉或篡改。群组密文格式、AAD 防篡改、防重放保护。
|
|
@@ -116,15 +119,18 @@ Gateway 模式定位与职责、Gateway 发现机制、连接时序(auth.* →
|
|
|
116
119
|
|
|
117
120
|
### 10-Group-子协议
|
|
118
121
|
`group.*` 命名空间完整协议规范。群组生命周期(create/suspend/resume/dissolve)、成员管理(add/kick/set_role/transfer_owner)、群消息(send/pull/ack、`payload.type` 负载类型)、`group.index` 签名索引与 `expected_index_etag` CAS、`_meta.group_indexes` 版本提示、入群申请与邀请码、群规则与公告、资源共享、在线状态、事件推送(group.created/changed/message_created)、错误码(-33001~-33009)。Group Service 作为独立 AID 持有者运行,Gateway/Message 不生成或改写 group index。
|
|
119
|
-
|
|
120
|
-
###
|
|
122
|
+
|
|
123
|
+
### 13-Agent行为规范
|
|
124
|
+
定义 AUN 原生自主模式、收发方无强制响应义务、客户端 UI 约束,以及群 `mention_mode` 在 channel 层过滤消息与 Agent 自主决策之间的边界。
|
|
125
|
+
|
|
126
|
+
### 11-Storage-子协议
|
|
121
127
|
`storage.*` 命名空间完整协议规范。控制面与数据面分离(小对象内联 RPC,大对象预签名 URL HTTP 传输)、per-AID 隔离、对象键路径化、版本化 CAS 并发控制。方法:put_object / get_object / delete_object / list_objects / create_upload_session / create_download_ticket。
|
|
122
128
|
|
|
123
129
|
### 12-Stream-子协议
|
|
124
|
-
`stream.*` 命名空间完整协议规范。控制面通过 JSON-RPC(stream.create / close / get_info / list_active)管理流生命周期,数据面通过独立端口的 WebSocket(推流)和 HTTP SSE
|
|
130
|
+
`stream.*` 命名空间完整协议规范。控制面通过 JSON-RPC(stream.create / close / get_info / list_active)管理流生命周期,数据面通过独立端口的 WebSocket(推流)和 HTTP SSE(拉流)传输。当前实现以独立 push/pull token 作为能力凭证,通过 Authorization/X-Stream-Token Header 传递,URL 不含凭据;拉流可跨域使用,并支持 Late Joiner 回放、Last-Event-ID 断线续拉、空闲/离线超时自动关闭。
|
|
125
131
|
|
|
126
132
|
### 15-离线推送通知协议
|
|
127
|
-
|
|
133
|
+
定义独立 Push Service 的外部协议。应用侧 `push_notify_aid` 对应线上 RPC 字段 `push_server_aid`;Python SDK 推荐在 `connect()` 中携带 `push_notify_aid/push_token`,由 SDK 建连后调用 `push.register`,运行期可用 `client.push.register/unregister` 变更。Push Service 按 installation 保存 registration,离线复核后生成稳定 delivery,向确定的 Push Server 长连接定向发送 `push.offline_message`,并用批次级 `push.ack`、持久 timeout、重试和重启恢复闭环。事件不含正文或密文,token 由 Push Server 自签自验;V1 不跨 federation,生产仍受 token 加密门限制。
|
|
128
134
|
|
|
129
135
|
### 16-系统目录保护方案
|
|
130
136
|
定义 `memberdata` 与 `group_data` 的分层保护。`memberdata` 不是隐藏目录,但根和成员槽位根不可被普通文件操作破坏,group AID 命名空间下的普通 Storage 写入必须拒绝;`group_data` 是成员个人 Storage 内部真实根,Storage 服务端必须在目录树浏览中隐藏它,读/下载按普通 read 权限处理,写入、删除、重命名、挂载、授权和状态变更必须拒绝。文档同时规定 `group_data` 空间计入真实 owner AID 配额,group.fs 是可信授权写入路径,并给出访问矩阵、生命周期、审计和测试验收要求。
|
|
@@ -55,17 +55,17 @@ sequenceDiagram
|
|
|
55
55
|
"protocol": { "min": "1.0", "max": "1.0" },
|
|
56
56
|
"device": { "id": "来自 ~/.aun/.device_id", "type": "desktop" },
|
|
57
57
|
"client": { "slot_id": "slot-a" },
|
|
58
|
-
"delivery_mode": {
|
|
59
|
-
"mode": "queue",
|
|
60
|
-
"routing": "sender_affinity",
|
|
61
|
-
"affinity_ttl_ms": 300000
|
|
62
|
-
},
|
|
63
|
-
"options": { "kind": "long" },
|
|
64
|
-
"extra_info": { "app": "demo" },
|
|
65
|
-
"capabilities": {
|
|
66
|
-
"e2ee": true,
|
|
67
|
-
"group_e2ee": true
|
|
68
|
-
}
|
|
58
|
+
"delivery_mode": {
|
|
59
|
+
"mode": "queue",
|
|
60
|
+
"routing": "sender_affinity",
|
|
61
|
+
"affinity_ttl_ms": 300000
|
|
62
|
+
},
|
|
63
|
+
"options": { "kind": "long" },
|
|
64
|
+
"extra_info": { "app": "demo" },
|
|
65
|
+
"capabilities": {
|
|
66
|
+
"e2ee": true,
|
|
67
|
+
"group_e2ee": true
|
|
68
|
+
}
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
```
|
|
@@ -74,12 +74,12 @@ sequenceDiagram
|
|
|
74
74
|
|
|
75
75
|
- `protocol.min/max` 在 `auth.connect` 阶段完成 Gateway 会话版本协商;详细规则见协议文档 `03-Gateway-连接模式.md`。
|
|
76
76
|
- `device.id` 是设备级稳定标识,Python SDK 默认从 `~/.aun/.device_id` 读取。
|
|
77
|
-
- `client.slot_id` 由应用层显式传入,用于区分同设备上的多个实例槽位。SDK 允许 `/`、`:`、空格作为隔离键分隔符,例如 `evolclaw cli`、`evolclaw/cli`、`evolclaw:cli` 的隔离键都是 `evolclaw`。
|
|
78
|
-
- `delivery_mode` 决定该 AID 当前连接的投递语义;同一 AID 的所有在线连接必须保持一致。
|
|
79
|
-
- `options.kind` 声明连接类型:`"long"`(默认)= 长连接,承担服务端推送 / 事件订阅;`"short"` = 短连接,仅用于发送 RPC 并等待响应即断开。同 `(aid, device.id, slotIsolationKey(client.slot_id))` 隔离槽下,长连接最多 1 条,短连接最多 10 条;短连接不会顶掉长连接。
|
|
80
|
-
- `options.short_ttl_ms` 仅在 `kind="short"` 时有效,可选;服务端兜底超时后主动关闭短连接,防止占名额。
|
|
81
|
-
- `extra_info` 是应用层自定义连接信息,可用于审计、踢人提示或排障;SDK 会过滤下划线开头的内部键。
|
|
82
|
-
- `capabilities` 是客户端能力声明;`hello-ok.result.capabilities` 是服务端能力公告,不是双方能力交集。
|
|
77
|
+
- `client.slot_id` 由应用层显式传入,用于区分同设备上的多个实例槽位。SDK 允许 `/`、`:`、空格作为隔离键分隔符,例如 `evolclaw cli`、`evolclaw/cli`、`evolclaw:cli` 的隔离键都是 `evolclaw`。
|
|
78
|
+
- `delivery_mode` 决定该 AID 当前连接的投递语义;同一 AID 的所有在线连接必须保持一致。
|
|
79
|
+
- `options.kind` 声明连接类型:`"long"`(默认)= 长连接,承担服务端推送 / 事件订阅;`"short"` = 短连接,仅用于发送 RPC 并等待响应即断开。同 `(aid, device.id, slotIsolationKey(client.slot_id))` 隔离槽下,长连接最多 1 条,短连接最多 10 条;短连接不会顶掉长连接。
|
|
80
|
+
- `options.short_ttl_ms` 仅在 `kind="short"` 时有效,可选;服务端兜底超时后主动关闭短连接,防止占名额。
|
|
81
|
+
- `extra_info` 是应用层自定义连接信息,可用于审计、踢人提示或排障;SDK 会过滤下划线开头的内部键。
|
|
82
|
+
- `capabilities` 是客户端能力声明;`hello-ok.result.capabilities` 是服务端能力公告,不是双方能力交集。
|
|
83
83
|
|
|
84
84
|
### (3) hello-ok — 握手完成
|
|
85
85
|
|
|
@@ -111,7 +111,52 @@ sequenceDiagram
|
|
|
111
111
|
|
|
112
112
|
---
|
|
113
113
|
|
|
114
|
-
##
|
|
114
|
+
## Capabilities(能力声明)
|
|
115
|
+
|
|
116
|
+
### 客户端能力声明
|
|
117
|
+
|
|
118
|
+
客户端在 `auth.connect` 时通过 `capabilities` 字段声明自身支持的特性。SDK 会自动填充以下能力:
|
|
119
|
+
|
|
120
|
+
```json
|
|
121
|
+
{
|
|
122
|
+
"capabilities": {
|
|
123
|
+
"e2ee": true,
|
|
124
|
+
"group_e2ee": true,
|
|
125
|
+
"supported_p2p_e2ee": ["e2ee_v2"],
|
|
126
|
+
"supported_group_e2ee": ["group_e2ee_v2"],
|
|
127
|
+
"inline_realtime_payload_v1": true
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
| Capability | 说明 |
|
|
133
|
+
|------------|------|
|
|
134
|
+
| `e2ee` | 支持 P2P E2EE V2 加密通信 |
|
|
135
|
+
| `group_e2ee` | 支持群组 E2EE V2 加密通信 |
|
|
136
|
+
| `supported_p2p_e2ee` | 明确支持的 P2P 加密版本列表 |
|
|
137
|
+
| `supported_group_e2ee` | 明确支持的群组加密版本列表 |
|
|
138
|
+
| `inline_realtime_payload_v1` | **支持实时推送内联消息载荷**(0.5.6+ 新增) |
|
|
139
|
+
|
|
140
|
+
### inline_realtime_payload_v1 详解
|
|
141
|
+
|
|
142
|
+
**背景**:传统模式下,Gateway 推送 `event/message.received` 或 `event/group.message` 时只包含消息元数据(如 `from`、`seq`、`message_id`),客户端需要调用 `message.pull` 或 `group.pull` 拉取完整载荷。
|
|
143
|
+
|
|
144
|
+
**优化**:声明 `inline_realtime_payload_v1: true` 后,Gateway 会在事件通知中直接内联完整的 `payload`、`envelope` 等字段,客户端无需额外 RPC 调用即可获取消息内容。
|
|
145
|
+
|
|
146
|
+
**好处**:
|
|
147
|
+
- **降低延迟**:消息到达即可处理,无需等待 pull RPC 往返
|
|
148
|
+
- **减少请求**:对于实时在线场景,可完全避免 pull 调用
|
|
149
|
+
- **保留回退**:离线消息和历史消息仍通过 pull 机制拉取,确保可靠性
|
|
150
|
+
|
|
151
|
+
**SDK 行为**:Python/Go/JS/TS SDK 自动声明此能力;应用层无需感知,事件回调中始终能获取完整消息。
|
|
152
|
+
|
|
153
|
+
### 服务端能力公告
|
|
154
|
+
|
|
155
|
+
`hello-ok.result.capabilities` 返回服务端支持的特性,客户端可根据此信息调整行为。服务端和客户端的 capabilities **不是交集协商**,而是各自独立声明。
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 消息格式
|
|
115
160
|
|
|
116
161
|
所有消息遵循 JSON-RPC 2.0 格式,通过以下规则区分类型:
|
|
117
162
|
|
|
@@ -57,6 +57,28 @@ SDK 在 `message.pull` / `message.ack` 中自动注入当前 `device_id` / `slot
|
|
|
57
57
|
|
|
58
58
|
---
|
|
59
59
|
|
|
60
|
+
## 消息实时窗口与历史拉取
|
|
61
|
+
|
|
62
|
+
P2P Message 和 Group Message 都在原 Forward Cursor 上维护三个本地持久化水位:
|
|
63
|
+
|
|
64
|
+
| 水位 | 含义 |
|
|
65
|
+
|------|------|
|
|
66
|
+
| `A / ack` | Forward 已扫描到的最大 seq,也是唯一允许提交 ACK 的水位 |
|
|
67
|
+
| `T / tail` | Tail 已扫描实时窗口的左边界 |
|
|
68
|
+
| `H / head` | Tail 已扫描实时窗口的右边界 |
|
|
69
|
+
|
|
70
|
+
收到 `head_server > H` 的 Push 通知时,SDK 内部自动拉取最新一页。最新页处理后若 `A < T - 1`,再执行一页后台 Forward;当 A 到达 `T - 1` 时自动折叠为 `A=T=H`。服务端原始页中的缺号视为永久空号,Forward 按页内最大 seq 推进 A,不再为页内缺号发起 Gap Fill。应用无需也不应构造内部最新页请求。
|
|
71
|
+
|
|
72
|
+
Tail 和 Forward 的水位由通过校验的服务端原始页决定。单条解密失败或应用回调失败会产生诊断事件,但不会永久卡住 A/T/H。History 使用独立的 `message.history` / `group.history`,只解密并返回历史页,不修改 A/T/H、不 ACK、也不触发实时消息事件。
|
|
73
|
+
|
|
74
|
+
冷启动缺少发送方 IK 时,SDK 会将同发送端请求 single-flight 合并,最多同步等待 3 秒执行 bootstrap;成功后立即重试当前消息解密,失败或超时才转入 pending 后台重试。这个有界阻塞只影响当前加密消息的首次处理,不改变“永久坏密文不阻塞 A/T/H”的规则。
|
|
75
|
+
|
|
76
|
+
每个 `AUNClient` 只有一个客户端级 Pull Gate。P2P Message、Group Message、Group Event 的 Pull 都进入该 Gate;Gate 始终 single-inflight,相同请求 key 折叠并共享同一结果,不同 key 排队,前台 FIFO 优先于后台 FIFO。Message Tail/History 属于前台,Message Forward/Gap Fill 与 Group Event Pull 属于后台。Group Event 仍使用独立的 Forward Cursor,但不使用独立 Gate;不同 `AUNClient` 实例之间不共享 Gate。应用层直接正常 `await client.call(...)` 即可,无需自行实现重复并发控制。
|
|
77
|
+
|
|
78
|
+
A/T/H 是服务端消息空间的扫描水位,不是应用层发布账本。SDK 只保证单个通过校验的 Tail/Forward 响应页内按 seq 升序、同 seq 最多发布一次;History 只解密返回,不进入实时发布流。Tail 与 Forward 的窗口可能重叠,因此跨 Push/Tail/Forward 页不保证唯一或有序。全局去重与排序属于应用业务仓库职责,不是 SDK 交付契约;应用必须在 namespace 内按 `message_id` 幂等,并按 `seq` 排序存储或展示。SDK 的进程内去重只能作为 best-effort 重叠折叠,不能替代应用持久化幂等。
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
60
82
|
## 连接状态机
|
|
61
83
|
|
|
62
84
|
```mermaid
|
|
@@ -16,14 +16,14 @@ if not loaded["ok"]:
|
|
|
16
16
|
raise RuntimeError(registered["error"]["message"])
|
|
17
17
|
loaded = store.load(aid)
|
|
18
18
|
|
|
19
|
-
me = loaded["data"]["aid"]
|
|
20
|
-
client = AUNClient(me)
|
|
21
|
-
await client.connect({"slot_id": "main", "auto_reconnect": True})
|
|
19
|
+
me = loaded["data"]["aid"]
|
|
20
|
+
client = AUNClient(me)
|
|
21
|
+
await client.connect({"slot_id": "main", "auto_reconnect": True})
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
关键约束:
|
|
25
25
|
|
|
26
|
-
- `AIDStore.register(aid)` 只负责生成本地密钥、申请证书并落盘。
|
|
26
|
+
- `AIDStore.register(aid)` 只负责生成本地密钥、申请证书并落盘。
|
|
27
27
|
- `AIDStore.load(aid)` 返回 AID 值对象;AID 对象加载后不可变。
|
|
28
28
|
- `AUNClient` 只接收 AID 对象,不接收字符串 AID 或配置字典里的 `aid` 字段。
|
|
29
29
|
- `connect(options)` 内部会按需认证、建立 WebSocket、初始化 E2EE 和后台任务。
|
|
@@ -62,12 +62,12 @@ store = AIDStore(
|
|
|
62
62
|
| `register(aid)` | 注册新 AID,返回 Result |
|
|
63
63
|
| `list()` | 列出本地身份 |
|
|
64
64
|
| `exists(aid)` | HEAD PKI 端点,判断 AID 是否已注册 |
|
|
65
|
-
| `resolve(aid, opts=None)` | 拉取并缓存对端证书;默认同时下载并验签 agent.md,可传 `skip_agent_md=True` 跳过 |
|
|
66
|
-
| `download_agent_md(aid)` | 下载并验签对端 agent.md |
|
|
67
|
-
| `check_agent_md(aid, ttl_days=1)` | 检查本地缓存与远端 agent.md 状态 |
|
|
68
|
-
| `diagnose(aid)` | 本地和远端一致性诊断 |
|
|
69
|
-
| `renew_cert(aid)` / `rekey(aid)` | 证书续签和换钥,成功后重新 `load()` |
|
|
70
|
-
|
|
65
|
+
| `resolve(aid, opts=None)` | 拉取并缓存对端证书;默认同时下载并验签 agent.md,可传 `skip_agent_md=True` 跳过 |
|
|
66
|
+
| `download_agent_md(aid)` | 下载并验签对端 agent.md |
|
|
67
|
+
| `check_agent_md(aid, ttl_days=1)` | 检查本地缓存与远端 agent.md 状态 |
|
|
68
|
+
| `diagnose(aid)` | 本地和远端一致性诊断 |
|
|
69
|
+
| `renew_cert(aid)` / `rekey(aid)` | 证书续签和换钥,成功后重新 `load()` |
|
|
70
|
+
|
|
71
71
|
Result 使用方式:
|
|
72
72
|
|
|
73
73
|
```python
|
|
@@ -89,46 +89,52 @@ client.load_identity(me) # standby
|
|
|
89
89
|
client = AUNClient(me) # standby
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
-
`load_identity()` 只允许在 `no_identity` 或 `closed` 状态调用;传入对象必须是私钥有效的 AID。
|
|
93
|
-
|
|
92
|
+
`load_identity()` 只允许在 `no_identity` 或 `closed` 状态调用;传入对象必须是私钥有效的 AID。
|
|
93
|
+
|
|
94
94
|
### 显式认证
|
|
95
95
|
|
|
96
|
-
通常不需要单独调用认证,`connect()`
|
|
96
|
+
通常不需要单独调用认证,`connect()` 会自动完成。需要提前完成认证或检查认证链路时可调用:
|
|
97
97
|
|
|
98
98
|
```python
|
|
99
99
|
auth = await client.authenticate()
|
|
100
100
|
print(auth["access_token"], auth["gateway"])
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
-
认证成功后状态进入 `authenticated`,随后调用 `connect()` 建立会话。
|
|
103
|
+
认证成功后状态进入 `authenticated`,随后调用 `connect()` 建立会话。
|
|
104
|
+
|
|
105
|
+
`authenticate()` 返回的 `access_token` 只是认证完成时的快照。后台刷新会更新 SDK 内部身份状态,但无法更新应用已经保存的字符串,因此不得把首次返回值长期用于 HTTP 请求。
|
|
106
|
+
|
|
107
|
+
### 读取当前 access token
|
|
108
|
+
|
|
109
|
+
应用绕过 SDK 门面、自行访问要求 AID Bearer 的 HTTP 数据面时,应在每次请求前同步读取当前缓存:
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
token = client.get_access_token() # str | None
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
const token = client.getAccessToken(); // string | null
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
```go
|
|
120
|
+
token := client.GetAccessToken() // 缺失时为空字符串
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
这些 getter 只读取后台刷新任务维护的最新缓存,不发起认证、刷新或网络请求,也不独立检查 token 是否临近过期;其有效性依赖客户端连接生命周期和后台刷新任务正常运行。返回空值时应先完成身份加载和认证/连接,不得发送空 Bearer。应用不得跨请求长期保存 getter 的返回值;具体的数据面票据、跨域凭据和重试规则见 [Storage RPC 手册:数据面 HTTP 下载流程](09-storage-rpc-manual.md#数据面-http-下载流程)。
|
|
104
124
|
|
|
105
125
|
### 连接
|
|
106
126
|
|
|
107
127
|
```python
|
|
108
128
|
await client.connect({
|
|
109
|
-
"slot_id": "main",
|
|
110
129
|
"connection_kind": "long",
|
|
111
|
-
"delivery_mode": {"mode": "fanout"},
|
|
112
|
-
"background_sync": True,
|
|
113
|
-
"extra_info": {"app": "demo"},
|
|
114
130
|
"auto_reconnect": True,
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
|
|
118
|
-
"initial_delay": 1.0,
|
|
119
|
-
"max_delay": 64.0,
|
|
120
|
-
},
|
|
121
|
-
"timeouts": {
|
|
122
|
-
"connect": 5.0,
|
|
123
|
-
"call": 10.0,
|
|
124
|
-
"http": 30.0,
|
|
125
|
-
},
|
|
126
|
-
})
|
|
131
|
+
"push_notify_aid": "push.example.com",
|
|
132
|
+
"push_token": "opaque-token",
|
|
133
|
+
})
|
|
127
134
|
```
|
|
128
135
|
|
|
129
136
|
| 选项 | 说明 |
|
|
130
137
|
|------|------|
|
|
131
|
-
| `slot_id` | 同一设备内的实例槽位;允许 `/`、`:`、空格作为共享隔离键分隔符 |
|
|
132
138
|
| `connection_kind` | `"long"` 或 `"short"` |
|
|
133
139
|
| `short_ttl_ms` | 短连接服务端兜底超时 |
|
|
134
140
|
| `delivery_mode` | 连接级投递语义 |
|
|
@@ -136,9 +142,12 @@ await client.connect({
|
|
|
136
142
|
| `background_sync` | 连接成功后是否执行 SDK 后台补洞 / 未读同步,默认开启 |
|
|
137
143
|
| `auto_reconnect` | 断线后是否自动重连 |
|
|
138
144
|
| `heartbeat_interval` | 心跳间隔,秒 |
|
|
139
|
-
| `
|
|
140
|
-
| `
|
|
141
|
-
| `
|
|
145
|
+
| `retry.initial_delay` / `retry.max_delay` | 退避重连参数 |
|
|
146
|
+
| `connect_timeout` / `call_timeout` | 连接和 RPC 超时,秒 |
|
|
147
|
+
| `push_notify_aid` / `push_token` | Python SDK 推荐的离线推送登记入口;必须同时提供 |
|
|
148
|
+
| `push_provider` / `push_app_id` | Python SDK 可选诊断字段 |
|
|
149
|
+
|
|
150
|
+
`slot_id` 来自已加载的 AID,不是 `connect()` 选项。Python SDK 在 AUN 会话建立后把 `push_notify_aid` 映射为冻结 RPC 字段 `push_server_aid`,调用 `push.register` 登记当前 `(aid, device_id, slot_id)`;这些字段不会进入 `auth.connect`。登记失败时本次连接回滚并向调用方抛错。Go、TypeScript、JavaScript SDK 本轮未增加该便利入口。
|
|
142
151
|
|
|
143
152
|
当前稳定实现为 Gateway 模式;Peer / Relay 仍是协议能力定义,SDK 连接层会明确返回未实现。
|
|
144
153
|
|
|
@@ -146,21 +155,21 @@ await client.connect({
|
|
|
146
155
|
|
|
147
156
|
## 长短连接共存
|
|
148
157
|
|
|
149
|
-
同一 `(aid, device_id, slotIsolationKey(slot_id))` 隔离槽下允许 1 条长连接 + 最多 10 条短连接。`slot_id` 的第一个 `/`、`:` 或空格之前的部分是共享隔离键,因此 `evolclaw daemon`、`evolclaw cli`、`evolclaw/netcheck` 会共享 `evolclaw` 隔离槽。
|
|
158
|
+
同一 `(aid, device_id, slotIsolationKey(slot_id))` 隔离槽下允许 1 条长连接 + 最多 10 条短连接。`slot_id` 的第一个 `/`、`:` 或空格之前的部分是共享隔离键,因此 `evolclaw daemon`、`evolclaw cli`、`evolclaw/netcheck` 会共享 `evolclaw` 隔离槽。
|
|
150
159
|
|
|
151
160
|
长连接:
|
|
152
161
|
|
|
153
162
|
```python
|
|
154
|
-
daemon = AUNClient(me)
|
|
155
|
-
await daemon.connect({"connection_kind": "long"
|
|
163
|
+
daemon = AUNClient(me)
|
|
164
|
+
await daemon.connect({"connection_kind": "long"})
|
|
156
165
|
daemon.on("message.received", lambda e: print(e["payload"]))
|
|
157
166
|
```
|
|
158
167
|
|
|
159
168
|
短连接:
|
|
160
169
|
|
|
161
170
|
```python
|
|
162
|
-
cli = AUNClient(me)
|
|
163
|
-
await cli.connect({"connection_kind": "short", "
|
|
171
|
+
cli = AUNClient(me)
|
|
172
|
+
await cli.connect({"connection_kind": "short", "short_ttl_ms": 30000})
|
|
164
173
|
await cli.call("message.send", {"to": peer, "payload": {"type": "text", "text": "hello"}})
|
|
165
174
|
await cli.close()
|
|
166
175
|
```
|
|
@@ -173,8 +182,8 @@ await cli.close()
|
|
|
173
182
|
|
|
174
183
|
注册、解析和认证会根据 AID 的 issuer 自动发现 Gateway:
|
|
175
184
|
|
|
176
|
-
-
|
|
177
|
-
-
|
|
185
|
+
- 所有环境:优先 `https://{aid}/.well-known/aun-gateway`,让 AID URL 命中 nameservice;失败后才回退到 `https://gateway.{issuer}/.well-known/aun-gateway`
|
|
186
|
+
- 开发模式只放宽本地 TLS 校验,不改变发现优先级
|
|
178
187
|
|
|
179
188
|
`verify_ssl` 由 `AUN_ENV` / `KITE_ENV` 控制。`development`、`dev`、`local` 会关闭校验,其余情况开启。
|
|
180
189
|
|
|
@@ -193,11 +202,11 @@ print(client.can_connect, client.can_send, client.is_online)
|
|
|
193
202
|
|
|
194
203
|
| 事件 | 说明 |
|
|
195
204
|
|------|------|
|
|
196
|
-
| `state_change` | 状态变化,payload 中的 `state` 是九态公开值 |
|
|
197
|
-
| `connection.error` | 连接、认证、重连错误 |
|
|
198
|
-
| `token.refreshed` | token 自动刷新完成 |
|
|
199
|
-
| `token.refresh_exhausted` | refresh_token 缺失、过期或刷新链耗尽,SDK 已清理本地 token,下一次重连会重新走完整登录 |
|
|
200
|
-
| `message.received` | 收到消息 |
|
|
205
|
+
| `state_change` | 状态变化,payload 中的 `state` 是九态公开值 |
|
|
206
|
+
| `connection.error` | 连接、认证、重连错误 |
|
|
207
|
+
| `token.refreshed` | token 自动刷新完成 |
|
|
208
|
+
| `token.refresh_exhausted` | refresh_token 缺失、过期或刷新链耗尽,SDK 已清理本地 token,下一次重连会重新走完整登录 |
|
|
209
|
+
| `message.received` | 收到消息 |
|
|
201
210
|
| `group.changed` | 群组事件 |
|
|
202
211
|
| `message.undecryptable` / `group.message_undecryptable` | E2EE 解密失败 |
|
|
203
212
|
|
|
@@ -205,49 +214,49 @@ print(client.can_connect, client.can_send, client.is_online)
|
|
|
205
214
|
|
|
206
215
|
---
|
|
207
216
|
|
|
208
|
-
## Agent Web / agent.md
|
|
209
|
-
|
|
210
|
-
发布自己的 agent.md:
|
|
211
|
-
|
|
212
|
-
```python
|
|
213
|
-
uploaded = await store.upload_agent_md("alice.agentid.pub", content)
|
|
214
|
-
```
|
|
215
|
-
|
|
217
|
+
## Agent Web / agent.md
|
|
218
|
+
|
|
219
|
+
发布自己的 agent.md:
|
|
220
|
+
|
|
221
|
+
```python
|
|
222
|
+
uploaded = await store.upload_agent_md("alice.agentid.pub", content)
|
|
223
|
+
```
|
|
224
|
+
|
|
216
225
|
`aid` 必须是本地 AID。上传由 `AIDStore` 读取本地私钥签名,并通过 `AuthFlow` 获取或复用该 AID 的 access_token。
|
|
217
226
|
|
|
218
|
-
解析对端并验签 agent.md:
|
|
227
|
+
解析对端并验签 agent.md:
|
|
219
228
|
|
|
220
229
|
```python
|
|
221
230
|
resolved = await store.resolve("bob.agentid.pub")
|
|
222
|
-
if resolved["ok"]:
|
|
223
|
-
print(resolved["data"]["agent_md"]["verification"]["status"])
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
只下载对端 agent.md:
|
|
227
|
-
|
|
228
|
-
```python
|
|
229
|
-
downloaded = await store.download_agent_md("bob.agentid.pub")
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
只检查本地缓存与远端状态:
|
|
233
|
-
|
|
234
|
-
```python
|
|
235
|
-
state = await store.check_agent_md("bob.agentid.pub", ttl_days=1)
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
当前公开入口分工固定:
|
|
239
|
-
|
|
240
|
-
| 主体 | 公开能力 |
|
|
241
|
-
|------|----------|
|
|
242
|
-
| `AIDStore` | `upload_agent_md(aid, content=None)`、`download_agent_md(aid)`、`check_agent_md(aid, ttl_days=1)`、`resolve(aid, opts)` |
|
|
243
|
-
| `AID` | `sign_agent_md(content)`、`verify_agent_md(content)` 低层签验能力 |
|
|
244
|
-
| `AUNClient` | 连接、事件和 RPC 调用;不再暴露 agent.md 上传入口 |
|
|
245
|
-
|
|
246
|
-
本地落盘位置由 SDK 管理。Python / TypeScript / Go 写入 `{aun_path}/AIDs/{aid}/agent.md` 和同目录 `agentmd.json`;浏览器 JavaScript 写入 IndexedDB 的等价 logical key,存储不可用时退化为内存缓存。agent.md 不写入 SQLite,也不再使用旧 `{aun_path}/AgentMDs` 目录。
|
|
247
|
-
|
|
248
|
-
连接后的 RPC 响应、事件推送和消息信封会被 SDK 自动观察:Gateway `_meta.agent_md_etags` 中的 `requester`、`peer`、`group` 以及兼容别名 `receiver`、`target`、`to`、`sender`、`from` 会更新对应 AID 的 `remote_etag` / `last_modified`;V2 信封中的 `agent_md.sender` 和 `agent_md.group` 也会写入同一份本地记录。`group` 表示群自身 `group_aid` / `group_id` 的 agent.md,缺少 `aid` 时 SDK 会从信封顶层或 AAD 的 `group_aid` / `group_id` 兜底。
|
|
249
|
-
|
|
250
|
-
---
|
|
231
|
+
if resolved["ok"]:
|
|
232
|
+
print(resolved["data"]["agent_md"]["verification"]["status"])
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
只下载对端 agent.md:
|
|
236
|
+
|
|
237
|
+
```python
|
|
238
|
+
downloaded = await store.download_agent_md("bob.agentid.pub")
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
只检查本地缓存与远端状态:
|
|
242
|
+
|
|
243
|
+
```python
|
|
244
|
+
state = await store.check_agent_md("bob.agentid.pub", ttl_days=1)
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
当前公开入口分工固定:
|
|
248
|
+
|
|
249
|
+
| 主体 | 公开能力 |
|
|
250
|
+
|------|----------|
|
|
251
|
+
| `AIDStore` | `upload_agent_md(aid, content=None)`、`download_agent_md(aid)`、`check_agent_md(aid, ttl_days=1)`、`resolve(aid, opts)` |
|
|
252
|
+
| `AID` | `sign_agent_md(content)`、`verify_agent_md(content)` 低层签验能力 |
|
|
253
|
+
| `AUNClient` | 连接、事件和 RPC 调用;不再暴露 agent.md 上传入口 |
|
|
254
|
+
|
|
255
|
+
本地落盘位置由 SDK 管理。Python / TypeScript / Go 写入 `{aun_path}/AIDs/{aid}/agent.md` 和同目录 `agentmd.json`;浏览器 JavaScript 写入 IndexedDB 的等价 logical key,存储不可用时退化为内存缓存。agent.md 不写入 SQLite,也不再使用旧 `{aun_path}/AgentMDs` 目录。
|
|
256
|
+
|
|
257
|
+
连接后的 RPC 响应、事件推送和消息信封会被 SDK 自动观察:Gateway `_meta.agent_md_etags` 中的 `requester`、`peer`、`group` 以及兼容别名 `receiver`、`target`、`to`、`sender`、`from` 会更新对应 AID 的 `remote_etag` / `last_modified`;V2 信封中的 `agent_md.sender` 和 `agent_md.group` 也会写入同一份本地记录。`group` 表示群自身 `group_aid` / `group_id` 的 agent.md,缺少 `aid` 时 SDK 会从信封顶层或 AAD 的 `group_aid` / `group_id` 兜底。
|
|
258
|
+
|
|
259
|
+
---
|
|
251
260
|
|
|
252
261
|
## RPC 调用
|
|
253
262
|
|
|
@@ -49,8 +49,12 @@ await client.call("message.send", {
|
|
|
49
49
|
4. E2EE 信封包含 `sender_signature`、AAD、`recipients_digest` / Merkle proof,接收端必须验签、验 AAD、验 recipient proof 后再解密。
|
|
50
50
|
|
|
51
51
|
每条消息独立密钥;V2 当前主路径不再使用旧 `prekey_ecdh_v2` / `long_term_key` 信封作为默认发送格式。旧术语只用于历史兼容文档或迁移排查。
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
|
|
53
|
+
接收端校验签名需要发送方 IK。若本地 session 和 PKI 证书都没有目标 sender/device 的 IK,Python、TypeScript、Go、JavaScript SDK 会先给当前消息一次有界同步补救机会:同一发送端的并发请求通过 single-flight 合并,最多阻塞 3 秒调用 `message.v2.bootstrap`;群消息仍未命中时再调用 `group.v2.bootstrap`。获取成功后立即重试当前消息解密;获取失败或超时才进入原有 pending 后台重试,History 则返回结构化解密失败项而不进入实时 pending。该补救会增加少量首条消息延迟,但避免冷启动时“消息已 ACK、IK 稍后才到、当前消息无回调”。
|
|
54
|
+
|
|
55
|
+
同步获取失败意味着当前时点仍不具备验签和解密条件,SDK 不伪造明文,也不因永久坏密文阻塞 Forward/Tail 水位。实时消息通过 `message.undecryptable` / `group.message_undecryptable` 暴露诊断;应用仍需按 `message_id` 幂等处理后续 pending 重试可能产生的补交付。
|
|
56
|
+
|
|
57
|
+
## ProtectedHeaders 与可验证上下文
|
|
54
58
|
|
|
55
59
|
`protected_headers` 是 E2EE 信封里的可选元数据字典,语义接近 HTTP headers:适合放 `device_id`、`slot_id`、`device_name`、`os`、`sdk_version`、`app_name` 等需要被接收端识别、且需要防篡改的非业务内容。`payload` 仍然类似 HTTP body,业务内容应放在 `payload` 内。
|
|
56
60
|
|