@agentunion/fastaun-browser 0.4.13 → 0.5.1

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.
Files changed (223) hide show
  1. package/CHANGELOG.md +536 -386
  2. package/_packed_docs/CHANGELOG-validators.md +144 -0
  3. package/_packed_docs/CHANGELOG.md +536 -386
  4. package/_packed_docs/INDEX.md +159 -84
  5. package/_packed_docs/KITE_DOCS_GUIDE.md +48 -31
  6. package/_packed_docs/agent.md/SCHEMA.md +2 -0
  7. package/_packed_docs/agent.md/examples/codeagent-claudecode.md +2 -0
  8. package/_packed_docs/agent.md/examples/human-developer.md +2 -0
  9. package/_packed_docs/agent.md/examples/openclaw-lobster.md +2 -0
  10. package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +2 -0
  11. package/_packed_docs/agent.md//350/277/234/347/250/213agent.md/347/274/223/345/255/230/344/270/216etag/351/200/217/344/274/240/346/226/271/346/241/210.md +2 -0
  12. package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +266 -686
  13. package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +331 -0
  14. package/_packed_docs/design/2026-05-22-aun-rpc-trace-enhancement.md +2 -0
  15. package/_packed_docs/design/AUNClient/346/213/206/345/210/206/351/207/215/346/236/204/346/211/247/350/241/214/346/226/271/346/241/210.md +2 -0
  16. package/_packed_docs/design/E2EE_V2/347/256/200/345/214/226/344/270/2721DH/345/212/240Per-AID_Wrap/346/226/271/346/241/210.md +2 -0
  17. package/_packed_docs/design//350/267/250/350/257/255/350/250/200/345/256/271/345/231/250E2E/346/265/213/350/257/225/346/226/271/346/241/210.md +2 -0
  18. package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +2 -0
  19. 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 +2 -0
  20. 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 +2 -0
  21. 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 +2 -0
  22. package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +2 -0
  23. package/_packed_docs/protocol/04-Peer-/345/255/220/345/215/217/350/256/256.md +2 -0
  24. package/_packed_docs/protocol/05-Relay-/345/255/220/345/215/217/350/256/256.md +2 -0
  25. 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 +2 -0
  26. package/_packed_docs/protocol/08-AUN-E2EE-Group.md +296 -900
  27. package/_packed_docs/protocol/08-AUN-E2EE.md +2 -0
  28. package/_packed_docs/protocol/09-/345/256/211/345/205/250/350/200/203/350/231/221.md +2 -0
  29. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +66 -173
  30. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +55 -0
  31. package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +2 -0
  32. package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +2 -0
  33. 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 +2 -0
  34. 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 +2 -0
  35. package/_packed_docs/protocol/16-/347/263/273/347/273/237/347/233/256/345/275/225/344/277/235/346/212/244/346/226/271/346/241/210.md +177 -0
  36. package/_packed_docs/protocol/README.md +4 -1
  37. package/_packed_docs/protocol/agent.md/SCHEMA.md +2 -0
  38. package/_packed_docs/protocol/agent.md/examples/codeagent-claudecode.md +2 -0
  39. package/_packed_docs/protocol/agent.md/examples/human-developer.md +2 -0
  40. package/_packed_docs/protocol/agent.md/examples/openclaw-lobster.md +2 -0
  41. package/_packed_docs/protocol/aun-docs-guide.md +2 -0
  42. package/_packed_docs/protocol/index.md +10 -3
  43. 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 +2 -0
  44. 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 +2 -0
  45. package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +2 -0
  46. 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 +2 -0
  47. 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 +2 -0
  48. 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 +2 -0
  49. 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 +2 -0
  50. 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 +2 -0
  51. 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 +2 -0
  52. 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 +2 -0
  53. 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 +2 -0
  54. 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 +2 -0
  55. 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 +2 -0
  56. package/_packed_docs/protocol//351/231/204/345/275/225L-E2EE/345/256/236/347/216/260/346/214/207/345/215/227.md +2 -0
  57. 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 +2 -0
  58. package/_packed_docs/protocol//351/231/204/345/275/225N-/345/210/206/345/270/203/345/274/217Trace/345/215/217/350/256/256.md +2 -0
  59. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +2 -0
  60. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +2 -0
  61. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +2 -0
  62. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +2 -0
  63. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +6 -252
  64. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +219 -177
  65. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +4 -1
  66. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +2 -0
  67. package/_packed_docs/sdk/09-collab-rpc-manual.md +581 -0
  68. package/_packed_docs/sdk/09-custody-api-manual.md +2 -0
  69. package/_packed_docs/sdk/09-group-rpc-manual.md +301 -634
  70. package/_packed_docs/sdk/09-message-rpc-manual.md +2 -0
  71. package/_packed_docs/sdk/09-meta-rpc-manual.md +2 -0
  72. package/_packed_docs/sdk/09-payload-reference.md +2 -0
  73. package/_packed_docs/sdk/09-proxy-rpc-manual.md +2 -0
  74. package/_packed_docs/sdk/09-storage-rpc-manual.md +984 -274
  75. package/_packed_docs/sdk/09-stream-rpc-manual.md +2 -0
  76. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +36 -23
  77. package/_packed_docs/sdk/E2EE_V2/346/266/210/346/201/257/351/200/232/344/277/241/346/227/266/345/272/217/345/233/276.md +2 -0
  78. package/_packed_docs/sdk/INDEX.md +47 -30
  79. package/_packed_docs/sdk/Notify/351/200/232/347/237/245/346/226/271/346/241/210.md +2 -0
  80. package/_packed_docs/sdk/README.md +17 -15
  81. package/dist/aid-store.d.ts +25 -0
  82. package/dist/aid-store.d.ts.map +1 -1
  83. package/dist/aid-store.js +89 -8
  84. package/dist/aid-store.js.map +1 -1
  85. package/dist/bundle.js +19615 -16870
  86. package/dist/client/delivery.d.ts +15 -2
  87. package/dist/client/delivery.d.ts.map +1 -1
  88. package/dist/client/delivery.js +303 -54
  89. package/dist/client/delivery.js.map +1 -1
  90. package/dist/client/group-state.d.ts.map +1 -1
  91. package/dist/client/group-state.js +36 -14
  92. package/dist/client/group-state.js.map +1 -1
  93. package/dist/client/lifecycle.js +2 -2
  94. package/dist/client/lifecycle.js.map +1 -1
  95. package/dist/client/rpc-pipeline.d.ts +2 -0
  96. package/dist/client/rpc-pipeline.d.ts.map +1 -1
  97. package/dist/client/rpc-pipeline.js +235 -82
  98. package/dist/client/rpc-pipeline.js.map +1 -1
  99. package/dist/client/v2-e2ee.d.ts +14 -1
  100. package/dist/client/v2-e2ee.d.ts.map +1 -1
  101. package/dist/client/v2-e2ee.js +300 -121
  102. package/dist/client/v2-e2ee.js.map +1 -1
  103. package/dist/client.d.ts +36 -4
  104. package/dist/client.d.ts.map +1 -1
  105. package/dist/client.js +460 -57
  106. package/dist/client.js.map +1 -1
  107. package/dist/collab/client.d.ts +47 -0
  108. package/dist/collab/client.d.ts.map +1 -0
  109. package/dist/collab/client.js +136 -0
  110. package/dist/collab/client.js.map +1 -0
  111. package/dist/collab/errors.d.ts +16 -0
  112. package/dist/collab/errors.d.ts.map +1 -0
  113. package/dist/collab/errors.js +60 -0
  114. package/dist/collab/errors.js.map +1 -0
  115. package/dist/collab/index.d.ts +4 -0
  116. package/dist/collab/index.d.ts.map +1 -0
  117. package/dist/collab/index.js +4 -0
  118. package/dist/collab/index.js.map +1 -0
  119. package/dist/collab/types.d.ts +111 -0
  120. package/dist/collab/types.d.ts.map +1 -0
  121. package/dist/collab/types.js +2 -0
  122. package/dist/collab/types.js.map +1 -0
  123. package/dist/crypto.d.ts +6 -0
  124. package/dist/crypto.d.ts.map +1 -1
  125. package/dist/crypto.js +6 -0
  126. package/dist/crypto.js.map +1 -1
  127. package/dist/errors.d.ts +0 -20
  128. package/dist/errors.d.ts.map +1 -1
  129. package/dist/errors.js +9 -37
  130. package/dist/errors.js.map +1 -1
  131. package/dist/facades.d.ts +94 -0
  132. package/dist/facades.d.ts.map +1 -0
  133. package/dist/facades.js +389 -0
  134. package/dist/facades.js.map +1 -0
  135. package/dist/group-fs.d.ts +120 -0
  136. package/dist/group-fs.d.ts.map +1 -0
  137. package/dist/group-fs.js +539 -0
  138. package/dist/group-fs.js.map +1 -0
  139. package/dist/group-id.d.ts +9 -12
  140. package/dist/group-id.d.ts.map +1 -1
  141. package/dist/group-id.js +41 -63
  142. package/dist/group-id.js.map +1 -1
  143. package/dist/group-resources.d.ts +98 -0
  144. package/dist/group-resources.d.ts.map +1 -0
  145. package/dist/group-resources.js +635 -0
  146. package/dist/group-resources.js.map +1 -0
  147. package/dist/index.d.ts +8 -3
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +10 -1
  150. package/dist/index.js.map +1 -1
  151. package/dist/keystore/index.d.ts +2 -54
  152. package/dist/keystore/index.d.ts.map +1 -1
  153. package/dist/keystore/indexeddb-identity-store.d.ts +3 -0
  154. package/dist/keystore/indexeddb-identity-store.d.ts.map +1 -1
  155. package/dist/keystore/indexeddb-identity-store.js +65 -0
  156. package/dist/keystore/indexeddb-identity-store.js.map +1 -1
  157. package/dist/keystore/indexeddb-shared.d.ts +3 -17
  158. package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
  159. package/dist/keystore/indexeddb-shared.js +4 -47
  160. package/dist/keystore/indexeddb-shared.js.map +1 -1
  161. package/dist/keystore/indexeddb-token-store.d.ts +1 -64
  162. package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
  163. package/dist/keystore/indexeddb-token-store.js +45 -774
  164. package/dist/keystore/indexeddb-token-store.js.map +1 -1
  165. package/dist/logger.d.ts +2 -0
  166. package/dist/logger.d.ts.map +1 -1
  167. package/dist/logger.js +4 -0
  168. package/dist/logger.js.map +1 -1
  169. package/dist/register-flow.d.ts +1 -0
  170. package/dist/register-flow.d.ts.map +1 -1
  171. package/dist/register-flow.js +3 -0
  172. package/dist/register-flow.js.map +1 -1
  173. package/dist/service-proxy.d.ts +1 -0
  174. package/dist/service-proxy.d.ts.map +1 -1
  175. package/dist/service-proxy.js +15 -3
  176. package/dist/service-proxy.js.map +1 -1
  177. package/dist/storage/errors.d.ts +28 -0
  178. package/dist/storage/errors.d.ts.map +1 -0
  179. package/dist/storage/errors.js +65 -0
  180. package/dist/storage/errors.js.map +1 -0
  181. package/dist/storage/index.d.ts +2 -0
  182. package/dist/storage/index.d.ts.map +1 -0
  183. package/dist/storage/index.js +2 -0
  184. package/dist/storage/index.js.map +1 -0
  185. package/dist/storage/lowlevel.d.ts +322 -0
  186. package/dist/storage/lowlevel.d.ts.map +1 -0
  187. package/dist/storage/lowlevel.js +471 -0
  188. package/dist/storage/lowlevel.js.map +1 -0
  189. package/dist/storage/types.d.ts +59 -0
  190. package/dist/storage/types.d.ts.map +1 -0
  191. package/dist/storage/types.js +113 -0
  192. package/dist/storage/types.js.map +1 -0
  193. package/dist/storage/vfs.d.ts +166 -0
  194. package/dist/storage/vfs.d.ts.map +1 -0
  195. package/dist/storage/vfs.js +457 -0
  196. package/dist/storage/vfs.js.map +1 -0
  197. package/dist/tools/cross-sdk-agent.d.ts +3 -0
  198. package/dist/tools/cross-sdk-agent.d.ts.map +1 -0
  199. package/dist/tools/cross-sdk-agent.js +1376 -0
  200. package/dist/tools/cross-sdk-agent.js.map +1 -0
  201. package/dist/transport.d.ts +5 -0
  202. package/dist/transport.d.ts.map +1 -1
  203. package/dist/transport.js +125 -12
  204. package/dist/transport.js.map +1 -1
  205. package/dist/types.d.ts +39 -56
  206. package/dist/types.d.ts.map +1 -1
  207. package/dist/v2/session/session.d.ts +2 -0
  208. package/dist/v2/session/session.d.ts.map +1 -1
  209. package/dist/v2/session/session.js +58 -22
  210. package/dist/v2/session/session.js.map +1 -1
  211. package/dist/v2/state/commitment.d.ts +1 -1
  212. package/dist/v2/state/commitment.d.ts.map +1 -1
  213. package/dist/v2/state/commitment.js +5 -3
  214. package/dist/v2/state/commitment.js.map +1 -1
  215. package/dist/validators.d.ts +35 -0
  216. package/dist/validators.d.ts.map +1 -0
  217. package/dist/validators.js +127 -0
  218. package/dist/validators.js.map +1 -0
  219. package/dist/version.d.ts +1 -1
  220. package/dist/version.d.ts.map +1 -1
  221. package/dist/version.js +1 -1
  222. package/dist/version.js.map +1 -1
  223. package/package.json +44 -44
@@ -17,12 +17,13 @@
17
17
  | 06 | [06-服务协议.md](06-服务协议.md) | 业务层:message.* / meta.* / search.* / task.* / group.* + 跨域消息路由 |
18
18
  | 07 | [07-错误码与状态机.md](07-错误码与状态机.md) | 错误码汇总、各模式状态机、重试分类 |
19
19
  | E2EE | [08-AUN-E2EE.md](08-AUN-E2EE.md) | 端到端加密安全层(横跨三种模式) |
20
- | E2EE-Group | [08-AUN-E2EE-Group.md](08-AUN-E2EE-Group.md) | 群组 E2EE:Epoch Group Key、Membership Commitment、密钥恢复 |
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.*` 群组管理、群消息、邀请码、资源共享、在线状态 |
23
23
  | 11 | [11-Storage-子协议.md](11-Storage-子协议.md) | `storage.*` 对象存储、大文件上传下载、预签名 URL |
24
24
  | 12 | [12-Stream-子协议.md](12-Stream-子协议.md) | `stream.*` 实时流式传输、WebSocket 推流、HTTP SSE 拉流、跨域拉流 |
25
25
  | 15 | [15-离线推送通知协议.md](15-离线推送通知协议.md) | `push.*` 离线推送、push_notify_aid 代理、事件通知 + 背压 ack、白名单与去重 |
26
+ | 16 | [16-系统目录保护方案.md](16-系统目录保护方案.md) | `memberdata` 与 `group_data` 的系统目录保护、目录树隐藏/读下载/写保护边界、配额归属和访问矩阵 |
26
27
 
27
28
  **附录**: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 实现
28
29
 
@@ -56,7 +57,8 @@
56
57
  | 群消息收发(group.send/pull) | 10 §10.5 |
57
58
  | 群成员权限(owner/admin/member) | 10 §10.2 |
58
59
  | 邀请码(group.create_invite_code) | 10 §10.7 |
59
- | 群资源共享(group.resources.*) | 10 §10.9 |
60
+ | 群文件系统(group.fs.*) | 10 §10.9 |
61
+ | 系统目录保护(memberdata / group_data) | 16 |
60
62
  | 对象存储(storage.*) | 11 |
61
63
  | 实时流传输(stream.*) | 12 |
62
64
  | 推流(WebSocket) | 12 §12.6 推流端点 |
@@ -106,7 +108,7 @@ Gateway 模式定位与职责、Gateway 发现机制、连接时序(auth.* →
106
108
  独立安全层,横跨三种连接模式。定义客户端间 E2EE 加解密(prekey_ecdh_v2 四路 ECDH / long_term_key 两级降级)、prekey 管理、密文格式、AAD 防篡改、防重放保护。无需在线协商。
107
109
 
108
110
  ### AUN-E2EE-Group
109
- 群组端到端加密规范。Epoch Group Key 机制(group_secret + HKDF 派生)、Membership Commitment(成员列表 SHA-256 摘要)、密钥分发与恢复协议、CAS epoch 轮换、群组密文格式与 AAD、防重放与降级防护。
111
+ 群组端到端加密规范(V2,当前唯一在用版本)。每条消息使用独立随机密钥,接收方按设备分别持有密钥包裹(wrap),不依赖群级共享对称密钥。成员状态通过签名版本链(state_version/state_chain)记录,接收方可据此检测状态分叉或篡改。群组密文格式、AAD 防篡改、防重放保护。
110
112
 
111
113
  ### 09-安全考虑
112
114
  威胁模型、传输层安全、认证安全、JWT 信任模型分析、连接升级安全(降级攻击/假地址注入/信令重放)、公开 AP 同步安全、证书轮换验签时序。
@@ -122,3 +124,8 @@ Gateway 模式定位与职责、Gateway 发现机制、连接时序(auth.* →
122
124
 
123
125
  ### 15-离线推送通知协议
124
126
  目标 AID 全部设备离线时的推送机制。push_notify_aid 作为普通客户端 AID 连接 Gateway,通过 `event/push.offline_message` 事件接收推送摘要(仅元数据,不含正文),处理后回 `push.ack` RPC 释放 in-flight 槽位(默认 max_in_flight=1 串行确认,30s 超时不重试)。聚合机制:同一 target_aid 60s 冷却期内合并为一条推送(unread_count++、senders 去重追加)。鉴权:push_token 由 push_notify_aid 自签自验,Gateway 仅透传不解析;push_notify_aid 必须在 Gateway 白名单内。跨域:推送由目标 AID 所属域的 Gateway 触发,push_notify_aid 必须与目标 AID 同域。
127
+
128
+ ### 16-系统目录保护方案
129
+ 定义 `memberdata` 与 `group_data` 的分层保护。`memberdata` 不是隐藏目录,但根和成员槽位根不可被普通文件操作破坏,group AID 命名空间下的普通 Storage 写入必须拒绝;`group_data` 是成员个人 Storage 内部真实根,Storage 服务端必须在目录树浏览中隐藏它,读/下载按普通 read 权限处理,写入、删除、重命名、挂载、授权和状态变更必须拒绝。文档同时规定 `group_data` 空间计入真实 owner AID 配额,group.fs 是可信授权写入路径,并给出访问矩阵、生命周期、审计和测试验收要求。
130
+
131
+
@@ -203,3 +203,5 @@ description: "An example agent"
203
203
  - 是否支持多签名(多个 AID 共同背书同一个 agent.md)?当前版本不支持
204
204
  - 是否定义签名过期后的"续签"流程?当前版本依赖重新签名
205
205
  - 是否把签名字段扩展到 agent.md 以外的 Agent Web 资源(如 index.html)?超出本草案范围
206
+
207
+
@@ -247,3 +247,5 @@ Alice ──meta.reject(scope=all, reason=unknown_sender)──> Stranger
247
247
  - 群组场景下,`meta.reject` 是定向单发还是群内广播?当前草案倾向定向,但群主/管理员角色的语义需要配合 group 子协议进一步讨论
248
248
  - reject 是否要进入 E2EE 通道?建议**是**,保持与其他 meta.* 消息一致
249
249
  - 是否在 agent.md 里声明"本 agent 是否响应 reject 信号"?当前版本不需要——所有 AUN agent 默认尊重
250
+
251
+
@@ -335,3 +335,5 @@ E2EE 加密时生成的一次性 ECDH 密钥对,用于与接收方 prekey(
335
335
  - ❌ JWT Token(应使用 JWT token,小写 token)
336
336
 
337
337
  ---
338
+
339
+
@@ -78,3 +78,5 @@ gateway:
78
78
  - 引入新的认证机制(保持 AID 双向挑战)
79
79
 
80
80
  ---
81
+
82
+
@@ -618,3 +618,5 @@ STH 用于证明某一时刻日志树的大小和根哈希。监控方应定期
618
618
  - 邮件列表:governance@aun.network
619
619
  - GitHub:https://github.com/aun-network/governance
620
620
  - 应急联系:security@aun.network
621
+
622
+
@@ -603,3 +603,5 @@ A:管理局会要求整改,如果拒绝整改或整改不力,可能被吊
603
603
  - 申请咨询:`root-ca-applications@aun.network`
604
604
  - 技术支持:`technical-support@aun.network`
605
605
  - 官方网站:`https://aun.network/root-ca`
606
+
607
+
@@ -546,3 +546,5 @@ Issuer CT 服务必须提供以下公开 HTTP 端点,不要求鉴权:
546
546
  | WebPKI Root → Intermediate → EE | Root → Registry → Issuer → Agent | 多级 CA 层级 | AUN 多一级(Registry CA) |
547
547
 
548
548
  AUN 的 Registry CA 在线签发模式借鉴了 ACME 协议的自动化理念,在保证 Root CA 离线安全的前提下,将 Issuer CA 签发时间从数周缩短到分钟级。
549
+
550
+
@@ -511,3 +511,5 @@ Issuer CA 运营商应将域名托管在第三方托管服务:
511
511
  - **多重保障**:技术、法律、财务多管齐下
512
512
  - **用户赋能**:提供工具让用户可以自救
513
513
  - **社区互助**:通过信任网络实现社交恢复
514
+
515
+
@@ -617,3 +617,5 @@ access_token 过期后,用 refresh_token 换取新的 access_token
617
617
  - 黑名单条目在 token 自然过期后自动清理
618
618
 
619
619
  ---
620
+
621
+
@@ -490,3 +490,5 @@ logger.info("cross_domain_route", extra={
490
490
  3. 使用标准 message.send 方法,格式与本域一致
491
491
  4. 注意 TLS 验证、限流、监控
492
492
 
493
+
494
+
@@ -128,3 +128,5 @@ https://{aid}.{issuer_domain}/{svc}
128
128
  - `index.html` 是 Agent 面向人类用户的默认首页
129
129
 
130
130
  这使 AUN 在保持去中心化身份体系的同时,也为 Agent 的公开发现、说明页、服务页和后续生态扩展提供了统一入口。
131
+
132
+
@@ -265,3 +265,5 @@ AES-GCM + AAD 验证保证消息完整性。AAD 包含以下字段,按 Canonic
265
265
  ## L.7 兼容性说明
266
266
 
267
267
  - 发送端 **MUST** 使用 `prekey_ecdh_v2`(四路 ECDH)模式发送新消息
268
+
269
+
@@ -365,3 +365,5 @@ Auth 服务证书轮换直接影响 JWT 验证,需特别处理:
365
365
  - 证书被吊销
366
366
 
367
367
  ---
368
+
369
+
@@ -255,3 +255,5 @@ if effective != client_mode:
255
255
  ## 文档版本
256
256
 
257
257
  - v1.0 — 2026-05-21 初稿,定义协议字段、链路传播、开关层级、安全约束
258
+
259
+
@@ -202,3 +202,5 @@ client := aun.NewAUNClient(aid.Data.AID)
202
202
  6. 通过 `close()` 释放连接和后台任务。
203
203
 
204
204
  详细 API 见 [06-API手册.md](06-API手册.md),RPC 参数见各领域的 `09-*-rpc-manual.md`。
205
+
206
+
@@ -356,3 +356,5 @@ async def main():
356
356
 
357
357
  asyncio.run(main())
358
358
  ```
359
+
360
+
@@ -166,3 +166,5 @@ client.on("message.received", lambda e: print(e["payload"]))
166
166
  ```
167
167
 
168
168
  RPC 方法参数见 `09-message-rpc-manual.md`、`09-group-rpc-manual.md`、`09-storage-rpc-manual.md` 等专项手册。
169
+
170
+
@@ -260,3 +260,5 @@ RPC 方法完整参数和响应格式见:
260
260
  | 群组 | [09-group-rpc-manual.md](09-group-rpc-manual.md) |
261
261
  | 存储 | [09-storage-rpc-manual.md](09-storage-rpc-manual.md) |
262
262
  | 元信息 | [09-meta-rpc-manual.md](09-meta-rpc-manual.md) |
263
+
264
+
@@ -56,16 +56,16 @@ SDK 优先使用 prekey_ecdh_v2,并默认要求前向保密:
56
56
 
57
57
  `protected_headers` 会随 E2EE 信封发送,接收端可以读取,因此它提供完整性保护,不提供机密性保护。不要把访问令牌、私钥、隐私正文或其他只允许端到端可见的内容放入 `protected_headers`;这类内容应放进加密的 `payload`。
58
58
 
59
- 推荐通过 SDK 实例级 setter 设置稳定元数据,例如 `client.set_protected_headers(...)` / `client.setProtectedHeaders(...)` / `client.SetProtectedHeaders(...)`。发送方也可以在以下 SDK 调用中传入顶层 `protected_headers` 作为单次发送的高级覆盖;`headers` 仅作为兼容旧调用的别名,不推荐新代码使用:
59
+ 推荐通过 SDK 实例级 setter 设置稳定元数据,例如 `client.set_protected_headers(...)` / `client.setProtectedHeaders(...)` / `client.SetProtectedHeaders(...)`。发送方也可以在以下 SDK 调用中传入顶层 `protected_headers` 作为单次发送的高级覆盖;`headers` 仅作为兼容旧调用的别名,不推荐新代码使用:
60
60
 
61
61
  - `message.send`
62
62
  - `message.thought.put`
63
63
  - `group.send`
64
64
  - `group.thought.put`
65
65
 
66
- `payload_type` 不需要应用层传入。SDK 会读取加密前 `payload.type`,自动写入 `protected_headers.payload_type`,接收端解密后会校验它与明文 `payload.type` 一致。
67
-
68
- `protected_headers` / `headers` 是 send/thought 参数的顶层字段,不放入单独的 `envelope` 入参对象,也不属于业务 `payload`。裸 WebSocket 客户端若自行发送已加密信封,需要把 protected headers 放在自构造的 E2EE 信封内并自行完成 `_auth`,服务端不会替裸 RPC 调用生成或校验明文侧的 protected headers。
66
+ `payload_type` 不需要应用层传入。SDK 会读取加密前 `payload.type`,自动写入 `protected_headers.payload_type`,接收端解密后会校验它与明文 `payload.type` 一致。
67
+
68
+ `protected_headers` / `headers` 是 send/thought 参数的顶层字段,不放入单独的 `envelope` 入参对象,也不属于业务 `payload`。裸 WebSocket 客户端若自行发送已加密信封,需要把 protected headers 放在自构造的 E2EE 信封内并自行完成 `_auth`,服务端不会替裸 RPC 调用生成或校验明文侧的 protected headers。
69
69
 
70
70
  示例:
71
71
 
@@ -268,20 +268,6 @@ result = await client.call("group.thought.get", {
268
268
 
269
269
  SDK 返回的 `result["thoughts"]` 是已解密数组。`group.thought.get` 是查询操作,重复读取同一条 thought 不按消息 replay 消费处理。
270
270
 
271
- ### 手动操作(通常不需要)
272
-
273
- `rotate_epoch()` 是纯本地密码学 API。多客户端并发环境下,应通过服务端 CAS(`group.e2ee.get_epoch` + `group.e2ee.rotate_epoch`)确保原子性,SDK 自动编排已使用 CAS 路径。
274
-
275
- ```python
276
- # 手动轮换 epoch(纯本地,不经过服务端 CAS 校验)
277
- info = client.group_e2ee.rotate_epoch("g-abc123.agentid.pub", member_aids)
278
-
279
- # 查询状态
280
- client.group_e2ee.has_secret("g-abc123.agentid.pub") # 是否持有密钥
281
- client.group_e2ee.current_epoch("g-abc123.agentid.pub") # 当前 epoch
282
- client.group_e2ee.get_member_aids("g-abc123.agentid.pub") # 已知成员列表
283
- ```
284
-
285
271
  ## 接收加密消息
286
272
 
287
273
  ### 推送接收
@@ -325,240 +311,6 @@ await client._upload_prekey()
325
311
  prekey_material = client.e2ee.generate_prekey()
326
312
  # 返回 {"prekey_id": "...", "public_key": "...", "signature": "...", "created_at": ...}
327
313
  # 需要自行上传:await transport.call("message.e2ee.put_prekey", prekey_material)
328
-
329
- ---
330
-
331
- ## 裸 WebSocket 开发者指南
332
-
333
- > 本节面向不使用 AUNClient 连接管理、自行管理 WebSocket 连接的开发者。
334
-
335
- ### 架构说明
336
-
337
- `E2EEManager` 是纯密码学工具类,无 I/O 依赖。构造函数只需:
338
-
339
- - `identity_fn` — 返回当前身份信息的函数
340
- - `keystore` — 密钥存储实现
341
-
342
- 所有 I/O(获取证书、获取 prekey、RPC 调用)由调用方自行处理。
343
-
344
- ### 实例化 E2EEManager
345
-
346
- ```python
347
- from aun_core.e2ee import E2EEManager
348
- from aun_core.keystore.local_token_store import LocalTokenStore
349
-
350
- e2ee = E2EEManager(
351
- identity_fn=lambda: my_identity,
352
- keystore=LocalTokenStore("~/.aun/myapp"),
353
- )
354
- ```
355
-
356
- ### 加密消息
357
-
358
- ```python
359
- # 1. 获取对方证书(HTTP)和 prekey(RPC,可选)
360
- peer_cert_pem = await fetch_cert(peer_aid) # 调用方实现
361
- prekey = await fetch_prekey(peer_aid) # 调用方实现,可能为 None
362
-
363
- # 2. 加密(传入 prekey 会自动缓存,后续可传 None 复用缓存)
364
- envelope, ok = e2ee.encrypt_message(
365
- to_aid="bob.agentid.pub",
366
- payload={"type": "text", "text": "秘密消息"},
367
- peer_cert_pem=peer_cert_pem,
368
- prekey=prekey,
369
- )
370
-
371
- # 3. 通过自己的 WebSocket 发送
372
- aad = envelope["aad"]
373
- await my_rpc_call("message.send", {
374
- "to": "bob.agentid.pub",
375
- "payload": envelope,
376
- "type": "e2ee.encrypted",
377
- "encrypted": True,
378
- "message_id": aad["message_id"],
379
- "timestamp": aad["timestamp"],
380
- })
381
- ```
382
-
383
- P2P 消息的投递语义来自连接阶段声明的 `delivery_mode`:
384
-
385
- - `fanout`:广播到在线实例,并保留离线历史
386
- - `queue`:只做单实例实时消费,不进入历史
387
-
388
- ### 解密消息
389
-
390
- ```python
391
- # 解密单条消息(内置本地防重放)
392
- decrypted = e2ee.decrypt_message(raw_message)
393
- if decrypted is not None:
394
- print(decrypted["payload"]) # 明文
395
- ```
396
-
397
- ### Prekey 缓存
398
-
399
- E2EEManager 内置 prekey 缓存(TTL 默认 1 小时):
400
-
401
- ```python
402
- # 首次传入 prekey → 自动缓存
403
- envelope, ok = e2ee.encrypt_message(..., prekey=fetched_prekey)
404
-
405
- # 后续传 None → 自动复用缓存
406
- envelope, ok = e2ee.encrypt_message(..., prekey=None)
407
-
408
- # 手动管理
409
- e2ee.cache_prekey("bob.agentid.pub", prekey_dict)
410
- cached = e2ee.get_cached_prekey("bob.agentid.pub")
411
- e2ee.invalidate_prekey_cache("bob.agentid.pub")
412
- ```
413
-
414
- ### 生成 Prekey
415
-
416
- ```python
417
- prekey_material = e2ee.generate_prekey()
418
- # 返回 {"prekey_id": "...", "public_key": "...", "signature": "...", "created_at": ...}
419
- # 自行上传到服务端
420
- await my_rpc_call("message.e2ee.put_prekey", prekey_material)
421
- ```
422
-
423
- ### 群组 E2EE(GroupE2EEManager)
424
-
425
- `GroupE2EEManager` 是群组 E2EE 的纯工具类,与 `E2EEManager` 平行。密码学和状态管理全自动,网络发送由调用方负责。
426
-
427
- #### 实例化
428
-
429
- ```python
430
- from aun_core.e2ee import GroupE2EEManager
431
- from aun_core.keystore.local_token_store import LocalTokenStore
432
-
433
- group_e2ee = GroupE2EEManager(
434
- identity_fn=lambda: my_identity,
435
- keystore=LocalTokenStore("~/.aun/myapp"),
436
- )
437
- ```
438
-
439
- #### 建群后创建 epoch 并分发
440
-
441
- ```python
442
- info = group_e2ee.create_epoch(group_id, member_aids)
443
- # info = {epoch, commitment, distributions: [{to, payload}, ...]}
444
-
445
- for dist in info["distributions"]:
446
- # 通过 P2P E2EE 发送密钥分发消息
447
- envelope, _ = e2ee.encrypt_message(
448
- to_aid=dist["to"], payload=dist["payload"],
449
- peer_cert_pem=fetch_cert(dist["to"]),
450
- )
451
- await my_rpc_call("message.send", {
452
- "to": dist["to"], "payload": envelope,
453
- "type": "e2ee.encrypted", "encrypted": True,
454
- ...
455
- })
456
- ```
457
-
458
- #### 加密群消息
459
-
460
- ```python
461
- envelope = group_e2ee.encrypt(group_id, {"type": "text", "text": "hello"})
462
- await my_rpc_call("group.send", {
463
- "group_id": group_id,
464
- "payload": envelope,
465
- "type": "e2ee.group_encrypted",
466
- "encrypted": True,
467
- })
468
- ```
469
-
470
- #### 解密群消息
471
-
472
- ```python
473
- decrypted = group_e2ee.decrypt(raw_group_message)
474
- # 内置防重放 + 外层 group_id/from/sender_aid 校验
475
- # 非加密消息原样返回,解密失败返回 None
476
-
477
- # 批量解密(用于 group.pull)
478
- results = group_e2ee.decrypt_batch(messages)
479
- ```
480
-
481
- #### 处理 P2P 密钥消息
482
-
483
- 所有密钥协议消息(分发/请求/响应)通过 P2P E2EE 传输。收到后先 P2P 解密,再交给 `handle_incoming`:
484
-
485
- ```python
486
- inner = e2ee.decrypt_message(p2p_message) # P2P 层解密
487
- result = group_e2ee.handle_incoming(inner["payload"])
488
-
489
- if result == "distribution":
490
- pass # 密钥已自动存储
491
- elif result == "distribution_rejected":
492
- pass # epoch 降级被拒
493
- elif result == "response":
494
- pass # 密钥恢复响应已存储
495
- elif result == "request":
496
- # 需要回复:查成员列表 → 构建响应 → P2P 发送
497
- members = get_group_members(group_id)
498
- response = group_e2ee.handle_key_request_msg(inner["payload"], members)
499
- if response:
500
- p2p_e2ee_send(inner["payload"]["requester_aid"], response)
501
- ```
502
-
503
- #### 踢人后轮换
504
-
505
- ```python
506
- info = group_e2ee.rotate_epoch(group_id, remaining_member_aids)
507
- for dist in info["distributions"]:
508
- p2p_e2ee_send(dist["to"], dist["payload"])
509
- ```
510
-
511
- 配合服务端 CAS 防脑裂(推荐):
512
-
513
- ```python
514
- # 1. 读当前 epoch
515
- status = await my_rpc_call("group.e2ee.get_epoch", {"group_id": group_id})
516
- # 2. CAS 递增(服务端校验 admin/owner 角色 + 原子递增 + rotation_signature 验签)
517
- cas = await my_rpc_call("group.e2ee.rotate_epoch", {
518
- "group_id": group_id, "current_epoch": status["epoch"],
519
- # Python SDK 自动附加 rotation_signature 和 rotation_timestamp
520
- # 裸客户端必须自行签名:sign("{group_id}|{current_epoch}|{new_epoch}|{aid}|{timestamp}")
521
- })
522
- if cas["success"]:
523
- info = group_e2ee.rotate_epoch_to(group_id, cas["epoch"], member_aids)
524
- for dist in info["distributions"]:
525
- p2p_e2ee_send(dist["to"], dist["payload"])
526
- # CAS 失败说明别的 admin 先轮换了,放弃即可
527
- ```
528
-
529
- #### 加人后轮换并分发密钥
530
-
531
- ```python
532
- # 成员加入改变成员集,推荐先通过服务端 CAS 推进 epoch。
533
- status = await my_rpc_call("group.e2ee.get_epoch", {"group_id": group_id})
534
- cas = await my_rpc_call("group.e2ee.rotate_epoch", {"group_id": group_id, "current_epoch": status["epoch"], ...})
535
- if cas["success"]:
536
- info = group_e2ee.rotate_epoch_to(group_id, cas["epoch"], updated_member_aids)
537
- for dist in info["distributions"]:
538
- p2p_e2ee_send(dist["to"], dist["payload"])
539
- ```
540
-
541
- #### 解密失败时请求恢复
542
-
543
- 当前 Python SDK 优先请求本地成员列表中的第一个候选者;零状态时退化为请求当前消息发送者。
544
-
545
- ```python
546
- recovery = group_e2ee.build_recovery_request(
547
- group_id, epoch, sender_aid=msg.get("sender_aid"),
548
- )
549
- if recovery:
550
- p2p_e2ee_send(recovery["to"], recovery["payload"])
551
- # 频率限制:同群同 epoch 30 秒内不重复请求
552
- ```
553
-
554
- #### 状态查询
555
-
556
- ```python
557
- group_e2ee.has_secret(group_id) # 是否持有密钥
558
- group_e2ee.current_epoch(group_id) # 当前 epoch,无密钥返回 None
559
- group_e2ee.get_member_aids(group_id) # 已知成员列表
560
- group_e2ee.load_all_secrets(group_id) # {epoch: secret_bytes} 映射
561
- group_e2ee.cleanup(group_id) # 清理过期旧 epoch(默认保留 7 天)
562
314
  ```
563
315
 
564
316
  ---
@@ -611,3 +363,5 @@ client = AUNClient(aid)
611
363
  | 群组 E2EE 为固定启用能力 | `group_e2ee=true`,不可关闭 |
612
364
  | 默认要求前向保密 | `require_forward_secrecy=true`,无 prekey 时拒绝 long_term_key 降级 |
613
365
  | 客户端操作签名 | `group.send`/`group.kick`/`group.add_member`/`group.leave` 等操作自动附加 `client_signature`,服务端强制验签 |
366
+
367
+