@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,15 +17,13 @@
17
17
  |------|------|
18
18
  | [group.create](#groupcreate) | 创建群组 |
19
19
  | [group.bind_aid](#groupbind_aid) | 为普通群绑定命名 AID |
20
- | [group.get](#groupget) | 查询群组信息 |
20
+ | [group.get_info](#groupget_info) | 查询群组信息(平铺格式,唯一推荐入口) |
21
21
  | [group.update](#groupupdate) | 更新群组资料 |
22
22
  | [group.list_my](#grouplist_my) | 列出我的群组 |
23
23
  | [group.search](#groupsearch) | 搜索公开群 |
24
- | [group.get_public_info](#groupget_public_info) | 查询公开群信息 |
25
24
  | [group.suspend](#groupsuspend) | 暂停群组 |
26
25
  | [group.resume](#groupresume) | 恢复群组 |
27
26
  | [group.dissolve](#groupdissolve) | 解散群组 |
28
- | [group.get_stats](#groupget_stats) | 获取统计信息 |
29
27
 
30
28
  ### 成员管理
31
29
 
@@ -37,6 +35,8 @@
37
35
  | [group.leave](#groupleave) | 主动退群 |
38
36
  | [group.set_role](#groupset_role) | 设置角色 |
39
37
  | [group.transfer_owner](#grouptransfer_owner) | 转让群主 |
38
+ | [group.bind_group_aid](#groupbind_group_aid) | 为匿名群绑定群身份 |
39
+ | [group.renew_group_aid](#grouprenew_group_aid) | 轮换群身份密钥 |
40
40
  | [group.ban](#groupban) | 封禁成员 |
41
41
  | [group.unban](#groupunban) | 解封成员 |
42
42
  | [group.get_banlist](#groupget_banlist) | 获取封禁列表 |
@@ -60,7 +60,6 @@
60
60
  |------|------|
61
61
  | [group.set_settings](#groupset_settings) | 统一设置群参数,含 `dispatch_mode` |
62
62
  | [group.get_settings](#groupget_settings) | 统一读取群参数 |
63
- | [group.get_dispatch_log](#groupget_dispatch_log) | 查看值班分发日志 |
64
63
 
65
64
  ### 消息
66
65
 
@@ -96,52 +95,39 @@
96
95
  | 方法 | 说明 |
97
96
  |------|------|
98
97
  | [group.get_summary](#groupget_summary) | 获取群组摘要 |
99
- | [group.get_metrics](#groupget_metrics) | 获取性能指标 |
100
98
 
101
- ### E2EE
99
+ ### 群设置
102
100
 
103
101
  | 方法 | 说明 |
104
102
  |------|------|
105
- | [group.e2ee.rotate_epoch](#groupe2eerotate_epoch) | 轮换 E2EE 纪元 |
106
- | [group.e2ee.get_epoch](#groupe2eeget_epoch) | 获取当前 E2EE 纪元 |
107
-
108
- ### 公告与规则
103
+ | [group.set_settings](#groupset_settings) | 统一设置群参数(含公告、规则、入群要求、dispatch_mode 等) |
104
+ | [group.get_settings](#groupget_settings) | 统一读取群参数 |
109
105
 
110
- | 方法 | 说明 |
111
- |------|------|
112
- | [group.get_announcement](#groupget_announcement) | 获取公告 |
113
- | [group.update_announcement](#groupupdate_announcement) | 更新公告 |
114
- | [group.get_rules](#groupget_rules) | 获取群规则 |
115
- | [group.update_rules](#groupupdate_rules) | 更新群规则 |
116
- | [group.get_join_requirements](#groupget_join_requirements) | 获取入群要求 |
117
- | [group.update_join_requirements](#groupupdate_join_requirements) | 更新入群要求 |
106
+ **便利方法**:SDK 提供向后兼容的便利方法(`getAnnouncement`/`updateAnnouncement`/`getRules`/`updateRules`/`getJoinRequirements`/`updateJoinRequirements`),内部调用 `set_settings`/`get_settings`,返回旧格式。新代码建议直接使用 `set_settings`/`get_settings`。
118
107
 
119
- ### 资源管理
108
+ ### 群文件系统
120
109
 
121
110
  | 方法 | 说明 |
122
111
  |------|------|
123
- | [group.resources.put](#groupresourcesput) | 分享资源 |
124
- | [group.resources.create_folder](#groupresourcescreate_folder) | 创建资源目录 |
125
- | [group.resources.list_children](#groupresourceslist_children) | 列出目录子节点 |
126
- | [group.resources.rename](#groupresourcesrename) | 重命名资源节点 |
127
- | [group.resources.move](#groupresourcesmove) | 移动资源节点 |
128
- | [group.resources.mount_object](#groupresourcesmount_object) | 挂载 storage 对象为资源 |
129
- | [group.resources.request_mount_object](#groupresourcesrequest_mount_object) | 申请挂载 storage 对象 |
130
- | [group.resources.unmount](#groupresourcesunmount) | 取消挂载资源 |
131
- | [group.resources.resolve_path](#groupresourcesresolve_path) | 按路径解析资源 |
132
- | [group.resources.list_refs_by_storage](#groupresourceslist_refs_by_storage) | storage 引用反查资源 |
133
- | [group.resources.cleanup_by_storage_ref](#groupresourcescleanup_by_storage_ref) | 清理失效 storage 引用 |
134
- | [group.resources.get](#groupresourcesget) | 查看资源 |
135
- | [group.resources.list](#groupresourceslist) | 列出资源 |
136
- | [group.resources.update](#groupresourcesupdate) | 更新资源元数据 |
137
- | [group.resources.get_access](#groupresourcesget_access) | 获取下载票据 |
138
- | [group.resources.resolve_access_ticket](#groupresourcesresolve_access_ticket) | 解析访问票据 |
139
- | [group.resources.delete](#groupresourcesdelete) | 删除资源 |
140
- | [group.resources.request_add](#groupresourcesrequest_add) | 申请分享 |
141
- | [group.resources.direct_add](#groupresourcesdirect_add) | 直接添加 |
142
- | [group.resources.list_pending](#groupresourceslist_pending) | 待审批列表 |
143
- | [group.resources.approve_request](#groupresourcesapprove_request) | 批准申请 |
144
- | [group.resources.reject_request](#groupresourcesreject_request) | 拒绝申请 |
112
+ | [group.fs.ls](#groupfsls) | 列出目录 |
113
+ | [group.fs.find](#groupfsfind) | 查找节点 |
114
+ | [group.fs.stat](#groupfsstat) | 查看节点 |
115
+ | [group.fs.lstat](#groupfslstat) | 查看链接本身 |
116
+ | [group.fs.df](#groupfsdf) | 查看用量 |
117
+ | [group.fs.create_download_ticket](#groupfscreate_download_ticket) | 创建下载票据 |
118
+ | [group.fs.set_acl](#groupfsset_acl) | 授予群自有区角色写 ACL |
119
+ | [group.fs.remove_acl](#groupfsremove_acl) | 撤销群自有区角色写 ACL |
120
+ | [group.fs.get_acl](#groupfsget_acl) | 查询群自有区角色 ACL |
121
+ | [group.fs.list_acl](#groupfslist_acl) | 查询群自有区角色 ACL(别名) |
122
+ | [group.fs.mkdir](#groupfsmkdir) | 创建目录 |
123
+ | [group.fs.rm](#groupfsrm) | 删除节点 |
124
+ | [group.fs.cp](#groupfscp) | 远程复制 |
125
+ | [group.fs.mv](#groupfsmv) | 远程移动 |
126
+ | [group.fs.check_upload](#groupfscheck_upload) | 上传前检查 |
127
+ | [group.fs.create_upload_session](#groupfscreate_upload_session) | 创建上传会话 |
128
+ | [group.fs.complete_upload](#groupfscomplete_upload) | 完成上传 |
129
+ | [group.fs.mount](#groupfsmount) | 挂载成员数据区 |
130
+ | [group.fs.umount](#groupfsumount) | 卸载成员数据区 |
145
131
 
146
132
  ### 在线状态
147
133
 
@@ -153,11 +139,13 @@
153
139
 
154
140
  ## Group ID 规范
155
141
 
156
- `group_id` 支持三种输入形式:`g-{slug}`、`g-{slug}@issuer-domain`、`g-{slug}.issuer-domain`。服务端接受输入后会统一规范化为 canonical group_id;本域内 `g-{slug}` 只是简写别名,响应、签名、E2EE AAD 和内部存储使用 canonical 形式。
142
+ `group_id` 的 canonical 形式为 `group.{issuer-domain}/{base}`,例如 `group.agentid.pub/10042`、`group.agentid.pub/team01`、`group.agentid.pub/g-abc123`。服务端接受输入后会规范化为 canonical group_id;响应和内部存储以 canonical 形式为准。SDK 发起 `group.*` 调用时也会对带域旧格式做同等规范化;裸客户端应使用同一规则生成签名和 E2EE AAD,避免同一群的不同别名产生不同材料。
157
143
 
158
- 短形式必须以 `g-` 开头,总长度 616 字符;`slug` 4 到 14 位,只能包含小写字母和数字。`group.create` 可以指定 `group_id`,但必须满足该规则且未被占用;如果已被占用会返回错误。不指定 `group_id` 时由服务端自动分配,服务端通过唯一约束兜底,发现碰撞会重新生成。
144
+ 兼容输入包括 canonical `group.{issuer-domain}/{base}`、本域简写 `{base}` / `g-{slug}`,以及旧跨域形式 `{base}@issuer-domain`、`{base}.issuer-domain`、`g-{slug}@issuer-domain`、`g-{slug}.issuer-domain`。`base` 支持 5 位及以上小写字母或数字,或 4 64 `[a-z0-9_-]` 风格名称;旧 `g-` 前缀形式继续兼容,`g-` 后为 4 到 32 位小写字母或数字。命名群使用 `group_name` 作为 base,规则见 `group.create` 参数说明。
159
145
 
160
- `https://group.issuer-domain/...` 这类群链接中,host 已携带 issuer,path 中的 `group_id` 使用本域简写形式,例如 `https://group.agentid.pub/g-abc123/invite/ic-xxx`。
146
+ `group.create` 可以指定自定义 `group_id`,但不能是纯数字(纯数字群号保留给服务端自动分配),且规范化后的 canonical group_id 未被占用;如果已被占用或与旧别名碰撞会返回错误。不指定 `group_id` 时服务端按群号自动分配,并通过唯一约束兜底,发现碰撞会重新生成。
147
+
148
+ 在 `https://group.issuer-domain/...` 这类群链接中,host 已携带 issuer,path 中的 `group_id` 使用 base 简写形式,例如 `https://group.agentid.pub/10042/invite/ic-xxx`;旧 `g-` base 群也可以表示为 `https://group.agentid.pub/g-abc123/invite/ic-xxx`。
161
149
 
162
150
  ---
163
151
 
@@ -242,27 +230,36 @@
242
230
  }
243
231
  ```
244
232
 
245
- ### group.get
233
+ ### group.get_info
246
234
 
247
- 查询群组信息。
235
+ 查询群组信息,返回平铺格式。默认返回公开字段;需要成员或管理员权限的字段必须通过 `required` 显式声明。
248
236
 
249
237
  **参数**:
250
238
 
251
239
  | 参数 | 类型 | 必填 | 说明 |
252
240
  |------|------|------|------|
253
241
  | `group_id` | string | 是 | 群组 ID |
242
+ | `required` | string[] | 否 | 受限字段声明:`member`、`state`、`e2ee`、`avatar` |
254
243
 
255
- **响应**:
244
+ **默认响应**:
256
245
 
257
246
  ```json
258
247
  {
259
248
  "found": true,
260
249
  "group_id": "g-abc123.agentid.pub",
261
- "group": { ... }
250
+ "group_aid": "g-abc123.agentid.pub",
251
+ "name": "开发讨论组",
252
+ "visibility": "public",
253
+ "status": "active",
254
+ "description": "技术讨论群",
255
+ "member_count": 42,
256
+ "created_at": 1234567890
262
257
  }
263
258
  ```
264
259
 
265
- > 若群组不存在,`found` `false`,`group` 为 `null`。
260
+ `required=["member"]` 会额外返回 `owner_aid`、`creator_aid`、`message_seq`、`event_seq`、`e2ee_epoch`、`updated_at`、`my_role` 等成员可见字段。
261
+
262
+ > `group.get` 和 `group.info` 已合并到 `group.get_info`;`group.get_info` 默认行为等价于原公开信息查询。
266
263
 
267
264
  ### group.update
268
265
 
@@ -339,21 +336,6 @@
339
336
 
340
337
  > **注意**:当前 `page` 固定为 1,不支持翻页。仅返回公开群组。
341
338
 
342
- ### group.get_public_info
343
-
344
- 查询公开群组信息。仅限 `visibility=public` 的群组可查询。
345
-
346
- **参数**:`group_id` (string, 必填)
347
-
348
- **响应**:
349
-
350
- ```json
351
- {
352
- "group_id": "g-abc123.agentid.pub",
353
- "group": { ... }
354
- }
355
- ```
356
-
357
339
  ### group.suspend
358
340
 
359
341
  暂停群组。暂停期间不能发送消息。需要 **admin 及以上**权限。
@@ -403,29 +385,6 @@
403
385
  }
404
386
  ```
405
387
 
406
- ### group.get_stats
407
-
408
- 获取群组统计信息。需要 **admin 及以上**权限。
409
-
410
- **参数**:`group_id` (string, 必填)
411
-
412
- **响应**:
413
-
414
- ```json
415
- {
416
- "group_id": "g-abc123.agentid.pub",
417
- "status": "active",
418
- "member_count": 42,
419
- "message_seq": 1000,
420
- "event_seq": 500,
421
- "pending_join_request_count": 3,
422
- "active_invite_code_count": 2,
423
- "ban_count": 1,
424
- "online_count": 10,
425
- "runtime_stats": { ... },
426
- "cleanup": { ... }
427
- }
428
- ```
429
388
 
430
389
  ---
431
390
 
@@ -531,7 +490,7 @@
531
490
 
532
491
  ### group.set_role
533
492
 
534
- 设置成员角色。需要 **owner** 权限。不能改变 owner 角色。
493
+ 设置成员角色。需要 **owner** 权限。不能改变 owner 角色。该 RPC 只改变 membership 中的角色事实,不授予或撤销群自有区写 ACL;`role:admin` 是否可写群自有区由 `group.fs.set_acl` / `group.fs.remove_acl` 显式控制。
535
494
 
536
495
  **参数**:
537
496
 
@@ -545,7 +504,7 @@
545
504
 
546
505
  ```json
547
506
  {
548
- "group_id": "g-abc123.agentid.pub",
507
+ "group": { ... },
549
508
  "member": {
550
509
  "group_id": "g-abc123.agentid.pub",
551
510
  "aid": "bob.agentid.pub",
@@ -554,7 +513,11 @@
554
513
  "joined_at": 1234567890,
555
514
  "last_ack_seq": 0,
556
515
  "last_pull_at": 0
557
- }
516
+ },
517
+ "old_role": "member",
518
+ "new_role": "admin",
519
+ "acl_model": "role_based",
520
+ "acl_policy": "unchanged"
558
521
  }
559
522
  ```
560
523
 
@@ -579,6 +542,113 @@
579
542
  }
580
543
  ```
581
544
 
545
+ ### group.bind_group_aid
546
+
547
+ 为匿名群绑定群身份(group_aid)。需要 owner 权限。
548
+
549
+ **幂等保证**:
550
+ - 已绑定且公钥匹配:返回已绑定的 group_aid 和证书
551
+ - 已绑定但公钥不同:报错 `group_aid_already_bound_different_key`
552
+ - 未绑定:签发新 group_aid 并绑定
553
+
554
+ **参数**:
555
+
556
+ | 参数 | 类型 | 必填 | 说明 |
557
+ |------|------|------|------|
558
+ | `group_id` | string | 是 | 群组 ID |
559
+ | `public_key` | string | 是 | 公钥 DER base64(SPKI 格式) |
560
+ | `curve` | string | 否 | 曲线名称(默认 P-256) |
561
+
562
+ **响应**:
563
+
564
+ ```json
565
+ {
566
+ "group": {
567
+ "group_id": "my-team",
568
+ "group_aid": "my-team.agentid.pub",
569
+ ...
570
+ },
571
+ "aid_cert": {
572
+ "cert": "-----BEGIN CERTIFICATE-----...",
573
+ "agentid": "my-team.agentid.pub"
574
+ }
575
+ }
576
+ ```
577
+
578
+ **SDK 封装**:
579
+
580
+ 各语言 SDK 的 `bindGroupAid` 方法已实现幂等逻辑:
581
+ 1. 优先从 pending 槽位加载暂存密钥(崩溃恢复)
582
+ 2. 未命中则生成新密钥并暂存到 pending 槽位
583
+ 3. 调用 RPC 成功后导入 group_aid 身份并清理 pending 槽位
584
+
585
+ ### group.renew_group_aid
586
+
587
+ 轮换群身份密钥。需要 owner 权限,且必须持有旧 group_aid 私钥。
588
+
589
+ **用途**:
590
+ - 群主密钥泄露后的安全轮换
591
+ - 定期密钥更新符合安全策略
592
+
593
+ **验证**:
594
+ - 服务端验证 `renew_proof` 签名(用旧私钥签名 canonical payload)
595
+ - 验证 `old_public_key` 与当前 group_aid 证书匹配
596
+ - 签发新证书并更新 group_aid
597
+
598
+ **参数**:
599
+
600
+ | 参数 | 类型 | 必填 | 说明 |
601
+ |------|------|------|------|
602
+ | `group_id` | string | 是 | 群组 ID |
603
+ | `group_aid` | string | 否 | 群身份 AID(可选,服务端可推导) |
604
+ | `old_public_key` | string | 是 | 旧公钥 DER base64 |
605
+ | `new_public_key` | string | 是 | 新公钥 DER base64 |
606
+ | `curve` | string | 否 | 新密钥曲线(默认 P-256) |
607
+ | `renew_proof` | object | 是 | 轮换授权签名 |
608
+
609
+ **renew_proof 结构**:
610
+
611
+ ```json
612
+ {
613
+ "nonce": "随机 nonce(32 字符十六进制)",
614
+ "issued_ms": 1234567890000,
615
+ "signature": "用旧私钥签名的 base64"
616
+ }
617
+ ```
618
+
619
+ **签名 canonical payload**:
620
+
621
+ ```
622
+ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(new_public_key)}|{nonce}|{issued_ms}
623
+ ```
624
+
625
+ 所有字段小写,用 `|` 分隔。
626
+
627
+ **响应**:
628
+
629
+ ```json
630
+ {
631
+ "group": {
632
+ "group_id": "my-team",
633
+ "group_aid": "my-team.agentid.pub",
634
+ ...
635
+ },
636
+ "aid_cert": {
637
+ "cert": "-----BEGIN CERTIFICATE-----...",
638
+ "agentid": "my-team.agentid.pub"
639
+ },
640
+ "old_cert_revoked": true
641
+ }
642
+ ```
643
+
644
+ **SDK 封装**:
645
+
646
+ 各语言 SDK 的 `renewGroupAid` 方法自动处理:
647
+ 1. 加载旧 group_aid 私钥
648
+ 2. 生成新密钥对
649
+ 3. 用旧私钥签名 canonical payload
650
+ 4. 调用 RPC 并用新密钥覆盖本地 group_aid 身份
651
+
582
652
  ### group.ban
583
653
 
584
654
  封禁成员。被封禁者禁止发消息但保留成员身份,且不能重新加入(如先被移除再封禁)。需要 **admin 及以上**权限。
@@ -947,32 +1017,6 @@ await client.call("group.set_settings", {
947
1017
  }
948
1018
  ```
949
1019
 
950
- ### group.get_dispatch_log
951
-
952
- 读取值班分发日志。成员可读,主要用于诊断 `dispatch.mode=duty`、超时回退、批量分发等运行时行为。
953
-
954
- **参数**:
955
-
956
- | 参数 | 类型 | 必填 | 默认值 | 说明 |
957
- |------|------|------|--------|------|
958
- | `group_id` | string | 是 | — | 群组 ID |
959
- | `date` | string | 否 | 当天 | 日志日期,格式由服务端日志文件名解析 |
960
- | `size` / `limit` | integer | 否 | 100 | 返回最后 N 条,最大 500 |
961
-
962
- **响应**:
963
-
964
- ```json
965
- {
966
- "group_id": "g-abc123.agentid.pub",
967
- "items": [],
968
- "total": 0,
969
- "page": 1,
970
- "size": 100
971
- }
972
- ```
973
-
974
- ---
975
-
976
1020
  ## 消息
977
1021
 
978
1022
  ### group.send
@@ -989,7 +1033,7 @@ await client.call("group.set_settings", {
989
1033
  | `payload` | object | 否 | 消息内容 |
990
1034
  | `type` | string | 否 | 信封/封装类型,普通业务消息无需填写;SDK 加密群消息时自动使用 `e2ee.group_encrypted` |
991
1035
  | `attachments` | array | 否 | 兼容旧接口的顶层附件元数据;推荐把业务附件放入 `payload.attachments` |
992
- | `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE 信封元数据,类似 HTTP headers;推荐使用 `protected_headers`,`headers` 仅作为兼容别名;服务端不解释,接收端验 `_auth` 后在 `e2ee.protected_headers` 暴露 |
1036
+ | `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE 信封元数据,类似 HTTP headers;推荐使用 `protected_headers`,`headers` 仅作为兼容别名;服务端不解释,接收端验 `_auth` 后在 `e2ee.protected_headers` 暴露 |
993
1037
 
994
1038
  ### Payload 参考约定
995
1039
 
@@ -1049,7 +1093,7 @@ SDK 调用时必须走群组 E2EE。应用层传入明文 `payload`,SDK 会加
1049
1093
  | `encrypt` | boolean | 否 | SDK 侧固定按 `true` 处理;`false` 会被拒绝 |
1050
1094
  | `thought_id` | string | 否 | thought item ID;不传时 SDK 生成 `gt-*` |
1051
1095
  | `timestamp` | integer | 否 | 客户端时间戳;不传时 SDK 生成 |
1052
- | `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE 信封元数据;推荐使用 `protected_headers`,`headers` 仅作为兼容别名;`context` 会被 SDK 复制进信封并单独验 `_auth` |
1096
+ | `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE 信封元数据;推荐使用 `protected_headers`,`headers` 仅作为兼容别名;`context` 会被 SDK 复制进信封并单独验 `_auth` |
1053
1097
 
1054
1098
  **SDK 调用示例**:
1055
1099
 
@@ -1239,422 +1283,108 @@ result = await client.call("group.thought.get", {
1239
1283
 
1240
1284
  ---
1241
1285
 
1242
- ## 公告与规则
1243
-
1244
- ### group.get_announcement
1245
-
1246
- 获取群公告。
1247
-
1248
- **参数**:`group_id` (string, 必填)
1249
-
1250
- **响应**:
1251
-
1252
- ```json
1253
- {
1254
- "group_id": "g-abc123.agentid.pub",
1255
- "announcement": { ... }
1256
- }
1257
- ```
1258
-
1259
- ### group.update_announcement
1260
-
1261
- 更新群公告。需要 **admin 及以上**权限。
1262
-
1263
- **参数**:
1264
-
1265
- | 参数 | 类型 | 必填 | 说明 |
1266
- |------|------|------|------|
1267
- | `group_id` | string | 是 | 群组 ID |
1268
- | `content` | string | 是 | 公告内容(上限由 announcement_max_length 配置,默认 4000) |
1269
- | `attachments` | array | 否 | 存储引用数组 |
1270
-
1271
- **响应**:
1272
-
1273
- ```json
1274
- {
1275
- "group_id": "g-abc123.agentid.pub",
1276
- "announcement": { ... }
1277
- }
1278
- ```
1279
-
1280
- ### group.get_rules
1281
-
1282
- 获取群规则。
1283
-
1284
- **参数**:`group_id` (string, 必填)
1285
-
1286
- **响应**:
1287
-
1288
- ```json
1289
- {
1290
- "group_id": "g-abc123.agentid.pub",
1291
- "rules": { ... }
1292
- }
1293
- ```
1294
-
1295
- ### group.update_rules
1296
-
1297
- 更新群规则。需要 **admin 及以上**权限。
1298
-
1299
- **参数**:`group_id` (string) + 规则字段(max_members, allow_member_invite 等,均可选)
1300
-
1301
- ### group.get_join_requirements
1302
-
1303
- 获取入群要求。
1304
-
1305
- **参数**:`group_id` (string, 必填)
1306
-
1307
- **响应**:
1308
-
1309
- ```json
1310
- {
1311
- "group_id": "g-abc123.agentid.pub",
1312
- "join_requirements": {
1313
- "group_id": "g-abc123.agentid.pub",
1314
- "mode": "approval",
1315
- "question": "请描述你的用途",
1316
- "auto_approve_patterns": [],
1317
- "max_pending": 100,
1318
- "updated_by": "alice.agentid.pub",
1319
- "updated_at": 1234567890
1320
- }
1321
- }
1322
- ```
1323
-
1324
- ### group.update_join_requirements
1325
-
1326
- 更新入群要求。需要 **admin 及以上**权限。
1327
-
1328
- **参数**:
1329
-
1330
- | 参数 | 类型 | 必填 | 说明 |
1331
- |------|------|------|------|
1332
- | `group_id` | string | 是 | 群组 ID |
1333
- | `mode` | string | 否 | `"open"` / `"approval"` / `"invite_only"` / `"closed"` |
1334
- | `question` | string | 否 | 入群问题 |
1335
- | `auto_approve_patterns` | array | 否 | 自动批准正则列表 |
1336
- | `max_pending` | integer | 否 | 最大待审批数 |
1337
-
1338
- ---
1339
-
1340
- ## 资源管理
1341
-
1342
- ### group.resources.put
1343
-
1344
- 分享资源链接到群组。需要 **member 及以上**权限。
1286
+ ## 群文件系统
1345
1287
 
1346
- **参数**:
1347
-
1348
- | 参数 | 类型 | 必填 | 说明 |
1349
- |------|------|------|------|
1350
- | `group_id` | string | 是 | 群组 ID |
1351
- | `resource_path` | string | 是 | 资源路径 |
1352
- | `resource_type` | string | 否 | `"file"` / `"folder"` / `"link"`,默认 `"file"` |
1353
- | `title` | string | 是 | 资源标题 |
1354
- | `storage_ref` | object | 否 | 存储引用对象 |
1355
- | `metadata` | object | 否 | 自定义元数据 |
1356
- | `visibility` | string | 否 | `"members_only"` / `"public"`,默认 `"members_only"` |
1357
- | `tags` | array | 否 | 标签数组 |
1288
+ 新代码统一使用 `group.fs.*`。路径为 POSIX 风格 group path:`group_aid:/docs/a.md`、`https://{group_aid}/docs/a.md` 或带 `group_id` 参数的裸路径。`group_aid:/memberdata/{member_ref}/...` 只由服务端映射到真实成员 storage,SDK 不拼接 `group_data/{group_aid}`。
1358
1289
 
1359
- **响应**:
1290
+ 推荐通过 SDK/CLI 使用:
1360
1291
 
1361
- ```json
1362
- {
1363
- "group_id": "g-abc123.agentid.pub",
1364
- "resource": { ... },
1365
- "created": true
1366
- }
1367
- ```
1368
-
1369
- > `created` 为 `true` 表示新建,`false` 表示更新已有资源。
1370
-
1371
- ### group.resources.create_folder
1372
-
1373
- 创建群资源目录。需要 **member 及以上**权限。
1374
-
1375
- **参数**:
1376
-
1377
- | 参数 | 类型 | 必填 | 说明 |
1378
- |------|------|------|------|
1379
- | `group_id` | string | 是 | 群组 ID |
1380
- | `path` / `resource_path` | string | 否 | 完整目录路径 |
1381
- | `name` | string | 否 | 目录名;未提供完整路径时使用 |
1382
- | `parent_resource_id` / `parent_path` | string | 否 | 父目录 |
1383
- | `title` | string | 否 | 显示标题,默认目录名 |
1384
- | `metadata` | object | 否 | 自定义元数据 |
1385
- | `visibility` | string | 否 | `"members_only"` / `"public"` |
1386
- | `tags` | array | 否 | 标签 |
1387
- | `mkdirs` | boolean | 否 | 是否递归创建父目录 |
1388
- | `sort_order` | integer | 否 | 排序值 |
1389
-
1390
- **响应**:`{ "group_id": "...", "resource": { ... }, "created": true }`。
1391
-
1392
- ### group.resources.list_children
1393
-
1394
- 列出某个资源目录下的直接子节点。
1395
-
1396
- **参数**:
1397
-
1398
- | 参数 | 类型 | 必填 | 说明 |
1399
- |------|------|------|------|
1400
- | `group_id` | string | 是 | 群组 ID |
1401
- | `resource_id` / `path` / `resource_path` | string | 否 | 父目录;不传表示根目录 |
1402
- | `type` / `resource_type` | string | 否 | `"folder"` / `"file"` / `"link"` |
1403
- | `include_status` | boolean | 否 | 是否附带 storage 状态 |
1404
- | `page` / `offset` | integer | 否 | 分页位置 |
1405
- | `size` / `limit` | integer | 否 | 每页数量 |
1406
- | `sort_by` | string | 否 | 排序字段,默认 `sort_order` |
1407
- | `order` | string | 否 | `"asc"` / `"desc"` |
1408
-
1409
- **响应**:`group_id`、`resource_id`、`path`、`items`、`total`、`count`、`page`、`size`、`offset`。
1410
-
1411
- ### group.resources.rename
1412
-
1413
- 重命名资源节点。需要资源创建者、storage owner、owner 或 admin 权限。
1414
-
1415
- **参数**:`group_id`,资源选择器(`resource_id` / `resource_path` / `path`),`new_name`;可选 `title`、`expected_version`。
1416
-
1417
- **响应**:更新后的 `resource`。
1418
-
1419
- ### group.resources.move
1420
-
1421
- 移动资源节点。目录不能移动到自身或自身子目录。
1422
-
1423
- **参数**:`group_id`,资源选择器,目标父目录(`dst_parent_resource_id` / `dst_parent_path`),可选 `new_name` / `dst_name`、`expected_version`。
1424
-
1425
- **响应**:更新后的 `resource`。
1426
-
1427
- ### group.resources.mount_object
1428
-
1429
- 将 `storage.*` 对象挂载为群资源。需要 **owner/admin** 权限。
1430
-
1431
- **参数**:
1432
-
1433
- | 参数 | 类型 | 必填 | 说明 |
1434
- |------|------|------|------|
1435
- | `group_id` | string | 是 | 群组 ID |
1436
- | `storage_ref` | object | 是 | storage 引用,通常包含 `owner_aid`、`bucket`、`object_id` 或 `object_key` |
1437
- | `path` / `resource_path` | string | 否 | 资源路径;不传时用 storage 文件名 |
1438
- | `title` | string | 否 | 显示标题 |
1439
- | `metadata` | object | 否 | 自定义元数据 |
1440
- | `visibility` | string | 否 | `"members_only"` / `"public"` |
1441
- | `tags` | array | 否 | 标签 |
1442
- | `mkdirs` | boolean | 否 | 是否递归创建父目录,默认 `true` |
1443
- | `conflict_policy` | string | 否 | `"reject"` / `"replace"` / `"keep_both"` |
1444
-
1445
- **响应**:`{ "group_id": "...", "resource": { ... }, "created": true }`。
1446
-
1447
- ### group.resources.request_mount_object
1448
-
1449
- 成员申请挂载自己的 storage 对象,进入待审批队列。语义等同 `group.resources.request_add`,但输入按挂载对象组织。
1450
-
1451
- **参数**:同 `group.resources.mount_object`,但不需要 owner/admin 权限。
1452
-
1453
- **响应**:`{ "group_id": "...", "request": { ... } }`。
1454
-
1455
- ### group.resources.unmount
1456
-
1457
- 取消挂载资源,等价于非递归 `group.resources.delete`。
1458
-
1459
- **参数**:`group_id`,资源选择器(`resource_id` / `resource_path` / `path`)。
1460
-
1461
- **响应**:删除结果。
1462
-
1463
- ### group.resources.resolve_path
1464
-
1465
- 按路径解析资源节点。
1466
-
1467
- **参数**:`group_id`、`path` / `resource_path`;可选 `expected_type`。
1468
-
1469
- **响应**:`resource_id`、`resource_type`、`resource_path`、`path`、`status`、`resource`。
1470
-
1471
- ### group.resources.list_refs_by_storage
1472
-
1473
- 按 storage 引用反查群资源。传 `group_id` 时要求调用者是该群成员;不传 `group_id` 时要求调用者是 `owner_aid`。
1474
-
1475
- **参数**:`owner_aid` 必填,`object_id` 或 `object_key` 至少一个;可选 `bucket`、`group_id`、`include_missing`、`offset`、`limit` / `size`。
1476
-
1477
- **响应**:`items`、`total`、`count`、`limit`、`offset`,并回显 storage 选择器字段。
1478
-
1479
- ### group.resources.cleanup_by_storage_ref
1480
-
1481
- 清理指向已删除或失效 storage 对象的资源引用。传 `group_id` 时要求 owner/admin 或 storage owner;不传 `group_id` 时要求 storage owner。
1482
-
1483
- **参数**:`owner_aid` 必填,`object_id` 或 `object_key` 至少一个;可选 `bucket`、`group_id`、`mode`。
1484
-
1485
- **响应**:`affected_count` 和被影响的资源 `items`。
1486
-
1487
- ### group.resources.get
1488
-
1489
- 查看资源详情。
1490
-
1491
- **参数**:`group_id` (string), `resource_path` (string)
1492
-
1493
- ### group.resources.list
1494
-
1495
- 列出群资源。
1496
-
1497
- **参数**:
1292
+ | 语言 | 入口 |
1293
+ |------|------|
1294
+ | Python | `client.group.fs` |
1295
+ | TypeScript / JavaScript | `client.group.fs` |
1296
+ | Go | `client.Group().FS()` |
1297
+ | CLI | `aun group fs ...` |
1498
1298
 
1499
- | 参数 | 类型 | 必填 | 默认值 | 说明 |
1500
- |------|------|------|--------|------|
1501
- | `group_id` | string | 是 | — | 群组 ID |
1502
- | `prefix` | string | 否 | — | 资源路径前缀 |
1503
- | `owner_aid` | string | 否 | — | 筛选创建者 |
1504
- | `visibility` | string | 否 | — | 筛选可见性 |
1505
- | `tags` | array | 否 | — | 筛选标签 |
1506
- | `sort_by` | string | 否 | `"resource_path"` | 排序字段 |
1507
- | `order` | string | 否 | `"asc"` | `"asc"` / `"desc"` |
1508
- | `size` | integer | 否 | 50 | 每页数量(也接受 `limit`) |
1509
- | `page` | integer | 否 | 1 | 页码(也接受 `offset`) |
1299
+ 权限与签名约束:
1510
1300
 
1511
- **响应**:
1301
+ - 群自有区是除 `memberdata` 等系统保留路径外的整个 `group_aid` namespace。`group_aid` 当前证书签名可写;`role:owner` 默认可写;`role:admin` 需要 owner 通过 `group.fs.set_acl` 显式授权后才可写。
1302
+ - `group.fs.set_acl` / `group.fs.remove_acl` / `group.fs.get_acl` / `group.fs.list_acl` 只能由当前 group owner 调用,且当前只允许管理或查询 `grantee_aid="role:admin"` 的群自有区角色 ACL;成员升降级、退群、踢出不会联动授权或撤销。
1303
+ - `memberdata/{member_ref}` 写入默认只允许该成员本人;SDK 只传 group path,不拼接真实 storage 路径。
1304
+ - 上传控制面会透传 `parents` 到 storage:默认 `parents=true` 时可递归创建父目录,显式 `parents=false` 时父目录必须已存在。
1305
+ - JavaScript 浏览器版 `cp(string, group)` 默认把 string 当文本内容上传;Node 本地路径需显式传 `sourceType: "path"`、`localPath: true` 或使用 `local:` 前缀。Python、TypeScript 和 Go 默认把 string 当本地路径。
1512
1306
 
1513
- ```json
1514
- {
1515
- "group_id": "g-abc123.agentid.pub",
1516
- "prefix": "",
1517
- "owner_aid": null,
1518
- "visibility": null,
1519
- "tags": [],
1520
- "limit": 50,
1521
- "size": 50,
1522
- "offset": 0,
1523
- "page": 1,
1524
- "items": [ ... ],
1525
- "count": 3,
1526
- "total": 3
1527
- }
1528
- ```
1307
+ ### group.fs.ls
1529
1308
 
1530
- ### group.resources.get_access
1309
+ 列出目录。参数:`path` 必填;可选 `page`、`size`、`marker`、`long`、`recursive`。响应返回 group view `items`,节点 `path` 仍为 group path。
1531
1310
 
1532
- 获取资源下载票据。
1311
+ ### group.fs.find
1533
1312
 
1534
- **参数**:`group_id` (string), `resource_path` (string)
1313
+ 查找节点。参数:`path` 必填;可选 `pattern`、`name`、`type`、`size`、`mtime`、`page`、`page_size`。
1535
1314
 
1536
- **响应**:
1315
+ ### group.fs.stat
1537
1316
 
1538
- ```json
1539
- {
1540
- "group_id": "g-abc123.agentid.pub",
1541
- "resource_path": "/docs/guide.pdf",
1542
- "resource_link": "storage://...",
1543
- "resource": { ... },
1544
- "access_ticket": {
1545
- "ticket": "tk_...",
1546
- "ticket_type": "group-resource-access",
1547
- "issued_to": "alice.agentid.pub",
1548
- "resource_link": "storage://...",
1549
- "issued_at": 1234567890,
1550
- "expire_at": 1234571490
1551
- },
1552
- "access_token": "tk_...",
1553
- "token_type": "Bearer",
1554
- "download": { ... }
1555
- }
1556
- ```
1317
+ 查看节点。参数:`path` 必填。响应为 NodeView。
1557
1318
 
1558
- ### group.resources.delete
1319
+ ### group.fs.lstat
1559
1320
 
1560
- 删除群资源链接。需要 admin 权限。
1321
+ 查看链接节点本身。参数同 `group.fs.stat`。
1561
1322
 
1562
- **参数**:`group_id` (string), `resource_path` (string)
1323
+ ### group.fs.df
1563
1324
 
1564
- **响应**:`{ "group_id": "g-abc123.agentid.pub", "resource_path": "/path/to/file" }`
1325
+ 查看群文件系统用量。参数可传 `path` `group_id`。
1565
1326
 
1566
- ### group.resources.update
1327
+ ### group.fs.create_download_ticket
1567
1328
 
1568
- 更新资源元数据。需要 admin 及以上权限。
1329
+ 创建下载票据。参数:`path` 必填。响应包含 `download_url`、可选 `sha256`、`content_type`、`file_name`。SDK 下载数据面使用该票据执行 HTTP GET 并校验 sha256。
1569
1330
 
1570
- **参数**:`group_id` (必填), `resource_path` (必填), `title` / `metadata` / `tags` / `visibility` (可选)
1331
+ ### group.fs.set_acl
1571
1332
 
1572
- **响应**:`{ "group_id": "g-abc123.agentid.pub", "resource": { ... } }`
1333
+ 授予群自有区角色 ACL。需要当前 group owner 身份签名调用;底层由 group 服务以内部门面写入 `storage.set_acl`。
1573
1334
 
1574
- ### group.resources.resolve_access_ticket
1335
+ 参数:`path` 必填,指向群自有区路径;`grantee_aid` 只能为 `role:admin`;`perms` 默认 `rwx`,必须包含写权限。`path` 可传 `group_aid:/archive` 等 group path。服务端写入 storage 内部权限位时会把 POSIX 删除位 `x` 映射为内部 `d`,对外响应仍显示 `rwx`。
1575
1336
 
1576
- 使用访问票据换取下载令牌。
1337
+ ### group.fs.remove_acl
1577
1338
 
1578
- **参数**:`ticket` (string, 必填)
1339
+ 撤销群自有区角色 ACL。需要当前 group owner 身份签名调用;底层由 group 服务以内部门面写入 `storage.remove_acl`。
1579
1340
 
1580
- **响应**:`{ "resource": { ... }, "download": { ... } }`
1341
+ 参数:`path` 必填,指向群自有区路径;`grantee_aid` 只能为 `role:admin`。撤销后,当前 admin 角色成员不再因该路径的 `role:admin` ACL 获得写权限。
1581
1342
 
1582
- ### group.resources.request_add
1343
+ ### group.fs.get_acl
1583
1344
 
1584
- 成员申请分享资源(需审批)。
1345
+ 查询群自有区角色 ACL。需要当前 group owner 身份签名调用;普通 admin/member 不能查询。参数:`path` 必填,指向群自有区路径;可传裸路径 + `group_id`,也可传完整 `group_aid:/...`。
1585
1346
 
1586
- **参数**:同 `group.resources.put`(不需要 `storage_ref`)。
1347
+ 响应包含 `group_id`、`group_aid`、`path`、`area`、`storage` 和 `acls`。`acls[].perms` 使用 POSIX 视图,删除权限显示为 `x`,因此 owner 授权 `role:admin:rwx` 后查询也返回 `rwx`。
1587
1348
 
1588
- **响应**:
1349
+ ### group.fs.list_acl
1589
1350
 
1590
- ```json
1591
- {
1592
- "group_id": "g-abc123.agentid.pub",
1593
- "request": {
1594
- "request_id": "req_...",
1595
- "group_id": "g-abc123.agentid.pub",
1596
- "requester_aid": "bob.agentid.pub",
1597
- "resource_path": "/docs/my-file.pdf",
1598
- "resource_type": "file",
1599
- "title": "我的文件",
1600
- "status": "pending",
1601
- "created_at": 1234567890,
1602
- "updated_at": 1234567890,
1603
- "visibility": "members_only",
1604
- "tags": [],
1605
- "reviewed_by": null,
1606
- "review_note": null,
1607
- "resource_created": false
1608
- }
1609
- }
1610
- ```
1351
+ `group.fs.get_acl` 的别名,参数、权限和返回结构完全相同。
1611
1352
 
1612
- ### group.resources.direct_add
1353
+ ### group.fs.mkdir
1613
1354
 
1614
- Owner/Admin 直接添加资源(无需审批)。需要 **owner/admin** 权限。
1355
+ 创建目录。参数:`path` 必填;`parents` 可选,默认 `false`。
1615
1356
 
1616
- **参数**:同 `group.resources.put`(`resource_type` 不能是 `"folder"`)。
1357
+ ### group.fs.rm
1617
1358
 
1618
- **响应**:同 `group.resources.put`。
1359
+ 删除节点。参数:`path` 必填;`recursive`、`force` 可选。
1619
1360
 
1620
- ### group.resources.list_pending
1361
+ ### group.fs.cp
1621
1362
 
1622
- 列出待审批的资源申请。需要 **owner** 权限。
1363
+ 只处理 group→group 远程复制。参数:`src`、`dst` 必填;`force`、`recursive`、`follow_symlinks` 可选。本地上传和下载由 SDK 的 `cp` 编排数据面,不直接调用此 RPC。
1623
1364
 
1624
- **参数**:`group_id` (string)
1365
+ ### group.fs.mv
1625
1366
 
1626
- ### group.resources.approve_request
1367
+ 只处理 group→group 远程移动。参数:`src`、`dst` 必填;`force` 可选。本地路径参与时 SDK/CLI 应拒绝。
1627
1368
 
1628
- 批准资源申请。需要 **owner** 权限。
1369
+ ### group.fs.check_upload
1629
1370
 
1630
- **参数**:`request_id` (string, 必填), `note` (string, 可选)
1371
+ 上传前检查。参数:`path`、`size_bytes`、`sha256`、`content_type`;可选 `force`、`parents`、`expected_version`、`metadata`。响应可包含 `target_exists`、`within_limit`、`instant`、`dedup_hit` `skip_upload`。
1631
1372
 
1632
- **响应**:
1373
+ ### group.fs.create_upload_session
1633
1374
 
1634
- ```json
1635
- {
1636
- "group_id": "g-abc123.agentid.pub",
1637
- "request": { ... },
1638
- "resource": { ... }
1639
- }
1640
- ```
1375
+ 创建上传会话。参数同 `check_upload`。响应包含 `upload_url`、`session_id`、可选 `headers`。SDK 使用该 URL 执行 HTTP PUT。
1641
1376
 
1642
- ### group.resources.reject_request
1377
+ ### group.fs.complete_upload
1643
1378
 
1644
- 拒绝资源申请。需要 **owner** 权限。
1379
+ 完成上传。参数包含 `path`、`sha256`、`size_bytes`、可选 `session_id`、`skip_blob`、`metadata`、`expected_version`。响应为 group view NodeView。
1645
1380
 
1646
- **参数**:`request_id` (string, 必填), `note` (string, 可选)
1381
+ ### group.fs.mount
1647
1382
 
1648
- **响应**:
1383
+ 挂载成员数据区。参数:`path` 必填;可选 `readonly`、`require_approval`、`source_bucket`、`expires_at`、`volume_id`。
1649
1384
 
1650
- ```json
1651
- {
1652
- "group_id": "g-abc123.agentid.pub",
1653
- "request": { ... }
1654
- }
1655
- ```
1385
+ ### group.fs.umount
1656
1386
 
1657
- ---
1387
+ 卸载成员数据区。参数:`path` 必填。对成员数据区卸载不删除成员源数据。
1658
1388
 
1659
1389
  ## 在线状态
1660
1390
 
@@ -1850,36 +1580,6 @@ Owner/Admin 直接添加资源(无需审批)。需要 **owner/admin** 权限
1850
1580
  }
1851
1581
  ```
1852
1582
 
1853
- ### group.get_metrics
1854
-
1855
- 获取群组性能指标,包含 E2EE epoch 范围记录。需要 **admin 及以上**权限。
1856
-
1857
- **参数**:`group_id` (必填)
1858
-
1859
- **响应**:
1860
-
1861
- ```json
1862
- {
1863
- "group_id": "g-abc123.agentid.pub",
1864
- "message_seq": 1000,
1865
- "event_seq": 2000,
1866
- "member_count": 10,
1867
- "online_count": 5,
1868
- "e2ee_epoch": 3,
1869
- "epoch_count": 4,
1870
- "epoch_ranges": [
1871
- {
1872
- "epoch": 0,
1873
- "start_msg_seq": 0,
1874
- "start_event_seq": 0,
1875
- "end_msg_seq": 100,
1876
- "end_event_seq": 200,
1877
- "rotated_by": "alice.agentid.pub",
1878
- "rotated_at": 1234567890
1879
- }
1880
- ]
1881
- }
1882
- ```
1883
1583
 
1884
1584
  ### group.refresh_member_types
1885
1585
 
@@ -1903,37 +1603,6 @@ Owner/Admin 直接添加资源(无需审批)。需要 **owner/admin** 权限
1903
1603
 
1904
1604
  ---
1905
1605
 
1906
- ## E2EE
1907
-
1908
- ### group.e2ee.rotate_epoch
1909
-
1910
- CAS 轮换群组 E2EE Epoch。需要 **admin 及以上**权限。
1911
-
1912
- **参数**:
1913
-
1914
- | 参数 | 类型 | 必填 | 说明 |
1915
- |------|------|------|------|
1916
- | `group_id` | string | 是 | 群组 ID |
1917
- | `current_epoch` | integer | 是 | 当前 epoch 值(CAS 校验) |
1918
- | `rotation_signature` | string | 是 | 轮换签名(Base64,ECDSA SHA-256) |
1919
- | `rotation_timestamp` | string | 是 | 轮换时间戳(秒) |
1920
-
1921
- **响应**:`{ "group_id": "g-abc123.agentid.pub", "success": true, "epoch": 4 }`
1922
-
1923
- > 签名格式:`{group_id}|{current_epoch}|{new_epoch}|{aid}|{rotation_timestamp}`。时间戳必须在 5 分钟窗口内。签名去重防止重放攻击(10 分钟窗口)。
1924
-
1925
- ### group.e2ee.get_epoch
1926
-
1927
- 获取当前 E2EE Epoch 值。
1928
-
1929
- **参数**:`group_id` (必填)
1930
-
1931
- **响应**:`{ "group_id": "g-abc123.agentid.pub", "epoch": 3 }`
1932
-
1933
- ---
1934
-
1935
- ---
1936
-
1937
1606
  ## 事件
1938
1607
 
1939
1608
  ### event/group.created
@@ -1957,32 +1626,31 @@ CAS 轮换群组 E2EE Epoch。需要 **admin 及以上**权限。
1957
1626
 
1958
1627
  **Payload**:
1959
1628
 
1960
- ```json
1961
- {
1962
- "envelope": {
1963
- "module_id": "group",
1964
- "action": "member_added",
1965
- "group_id": "g-abc123.agentid.pub",
1966
- "event_seq": 42
1967
- },
1968
- "module_id": "group",
1969
- "action": "member_added",
1970
- "group_id": "g-abc123.agentid.pub",
1629
+ ```json
1630
+ {
1631
+ "envelope": {
1632
+ "module_id": "group",
1633
+ "action": "member_added",
1634
+ "group_id": "g-abc123.agentid.pub",
1635
+ "event_seq": 42
1636
+ },
1637
+ "module_id": "group",
1638
+ "action": "member_added",
1639
+ "group_id": "g-abc123.agentid.pub",
1971
1640
  "event_seq": 42
1972
- }
1973
- ```
1974
-
1975
- SDK 交付给应用层的群事件信封字段统一放在 `envelope`。0.4.x 兼容期仍保留顶层 `module_id` / `action` / `group_id` / `event_seq` 等别名,下一个大版本 0.5.* 将移除这些顶层别名,请通过 `ev["envelope"]["action"]` 等路径访问。
1976
-
1977
- | 字段 | 类型 | 说明 |
1978
- |------|------|------|
1979
- | `envelope` | object | 群事件信封,包含 `module_id`、`action`、`group_id`、`event_seq`、`event_type`、`actor_aid`、`created_at`、`device_id`、`slot_id` 等存在的字段 |
1980
- | `module_id` | string | 固定 `"group"` |
1981
- | `action` | string | 变更类型(见下表) |
1982
- | `group_id` | string | 群组 ID |
1641
+ }
1642
+ ```
1643
+
1644
+ SDK 交付给应用层的群事件信封字段统一放在 `envelope`。0.4.x 兼容期仍保留顶层 `module_id` / `action` / `group_id` / `event_seq` 等别名,下一个大版本 0.5.* 将移除这些顶层别名,请通过 `ev["envelope"]["action"]` 等路径访问。
1645
+
1646
+ | 字段 | 类型 | 说明 |
1647
+ |------|------|------|
1648
+ | `envelope` | object | 群事件信封,包含 `module_id`、`action`、`group_id`、`event_seq`、`event_type`、`actor_aid`、`created_at`、`device_id`、`slot_id` 等存在的字段 |
1649
+ | `module_id` | string | 固定 `"group"` |
1650
+ | `action` | string | 变更类型(见下表) |
1651
+ | `group_id` | string | 群组 ID |
1983
1652
  | `event_seq` | integer | 可选,服务端分配的单调递增序号,用于 SDK 内部保序去重 |
1984
- | `request_id` | string | 可选,仅资源审批相关 action |
1985
- | `resource_path` | string | 可选,仅资源相关 action |
1653
+ | `path` | string | 可选,Group FS 相关 action 的节点路径 |
1986
1654
 
1987
1655
  **保序去重(SDK 内部行为)**:
1988
1656
 
@@ -2021,10 +1689,6 @@ SDK 交付给应用层的群事件信封字段统一放在 `envelope`。0.4.x
2021
1689
  | `resource_put` | 资源上传 |
2022
1690
  | `resource_updated` | 资源更新 |
2023
1691
  | `resource_deleted` | 资源删除 |
2024
- | `resource_request_created` | 资源申请创建 |
2025
- | `resource_direct_added` | 资源直接添加 |
2026
- | `resource_request_approved` | 资源申请批准 |
2027
- | `resource_request_rejected` | 资源申请拒绝 |
2028
1692
  | `suspended` | 群组暂停 |
2029
1693
  | `resumed` | 群组恢复 |
2030
1694
  | `dissolved` | 群组解散 |
@@ -2074,71 +1738,71 @@ SDK 收到后自动解密 `payload`,解密后的明文消息直接交付用户
2074
1738
  }
2075
1739
  ```
2076
1740
 
2077
- SDK 收到后自动调用 `group.pull` 拉取最新消息并逐条解密后交付用户回调。
2078
-
2079
- **SDK 应用层回调形态**:
2080
-
2081
- ```json
2082
- {
2083
- "envelope": {
2084
- "group_id": "g-abc123.agentid.pub",
2085
- "from": "alice.agentid.pub",
2086
- "type": "text",
2087
- "timestamp": 1234567890000
2088
- },
2089
- "group_id": "g-abc123.agentid.pub",
2090
- "seq": 42,
2091
- "message_id": "uuid",
2092
- "sender_aid": "alice.agentid.pub",
2093
- "message_type": "group.message",
2094
- "dispatch_mode": "broadcast",
2095
- "payload": {"type": "text", "text": "Hello"}
2096
- }
2097
- ```
2098
-
2099
- SDK 交付给应用层的 `payload` 是明文业务 JSON 对象;群消息信封字段统一放在 `envelope`。`envelope` 只保留可转发的归一化元数据,`from` 由 `sender_aid` 归一化而来,`timestamp` 由 `created_at` / `t_server` 归一化而来。0.4.x 兼容期仍保留顶层 `group_id` / `seq` / `message_id` / `sender_aid` / `dispatch_mode` 等别名,下一个大版本 0.5.* 将移除这些顶层别名;请通过 `msg["envelope"]["from"]`、`msg["envelope"]["timestamp"]` 等路径访问。
2100
-
2101
- ### event/group.message_recalled
1741
+ SDK 收到后自动调用 `group.pull` 拉取最新消息并逐条解密后交付用户回调。
1742
+
1743
+ **SDK 应用层回调形态**:
1744
+
1745
+ ```json
1746
+ {
1747
+ "envelope": {
1748
+ "group_id": "g-abc123.agentid.pub",
1749
+ "from": "alice.agentid.pub",
1750
+ "type": "text",
1751
+ "timestamp": 1234567890000
1752
+ },
1753
+ "group_id": "g-abc123.agentid.pub",
1754
+ "seq": 42,
1755
+ "message_id": "uuid",
1756
+ "sender_aid": "alice.agentid.pub",
1757
+ "message_type": "group.message",
1758
+ "dispatch_mode": "broadcast",
1759
+ "payload": {"type": "text", "text": "Hello"}
1760
+ }
1761
+ ```
1762
+
1763
+ SDK 交付给应用层的 `payload` 是明文业务 JSON 对象;群消息信封字段统一放在 `envelope`。`envelope` 只保留可转发的归一化元数据,`from` 由 `sender_aid` 归一化而来,`timestamp` 由 `created_at` / `t_server` 归一化而来。0.4.x 兼容期仍保留顶层 `group_id` / `seq` / `message_id` / `sender_aid` / `dispatch_mode` 等别名,下一个大版本 0.5.* 将移除这些顶层别名;请通过 `msg["envelope"]["from"]`、`msg["envelope"]["timestamp"]` 等路径访问。
1764
+
1765
+ ### event/group.message_recalled
2102
1766
 
2103
1767
  群消息撤回后推送给所有在线成员(与 pull 双 tombstone 兜底互补)。在线 push 是实时通道,双 tombstone 是离线 / 未读 / push 丢失时的可靠性兜底;两者最终一致,SDK 去重保证应用层只感知一次。
2104
1768
 
2105
1769
  **Payload**:
2106
1770
 
2107
- ```json
2108
- {
2109
- "envelope": {
2110
- "group_id": "g-abc123.agentid.pub",
2111
- "from": "alice.agentid.pub",
2112
- "type": "group.message_recalled",
2113
- "kind": "group.message_recalled",
2114
- "timestamp": 1234567890000
2115
- },
2116
- "module_id": "group",
2117
- "group_id": "g-abc123.agentid.pub",
2118
- "seq": 43,
2119
- "message_id": "grm-uuid",
2120
- "tombstone_message_id": "grm-uuid",
2121
- "message_ids": ["gm-aaa"],
2122
- "target_message_seqs": [42],
2123
- "sender_aid": "alice.agentid.pub",
1771
+ ```json
1772
+ {
1773
+ "envelope": {
1774
+ "group_id": "g-abc123.agentid.pub",
1775
+ "from": "alice.agentid.pub",
1776
+ "type": "group.message_recalled",
1777
+ "kind": "group.message_recalled",
1778
+ "timestamp": 1234567890000
1779
+ },
1780
+ "module_id": "group",
1781
+ "group_id": "g-abc123.agentid.pub",
1782
+ "seq": 43,
1783
+ "message_id": "grm-uuid",
1784
+ "tombstone_message_id": "grm-uuid",
1785
+ "message_ids": ["gm-aaa"],
1786
+ "target_message_seqs": [42],
1787
+ "sender_aid": "alice.agentid.pub",
2124
1788
  "recalled_by": "alice.agentid.pub",
2125
1789
  "recalled_at": 1234567890000,
2126
1790
  "reason": "",
2127
1791
  "member_aids": ["bob.agentid.pub"]
2128
- }
2129
- ```
2130
-
2131
- SDK 交付给应用层的撤回事件同样带 `envelope`。`envelope` 表示当前交付的撤回 tombstone / 通知自身信封,不是被撤回原消息的信封;业务侧被撤回的原消息列表继续使用 `message_ids` / `target_message_seqs`。`message_id` / `seq` 继续只保留在顶层兼容字段中,不进入 `envelope`。0.4.x 兼容期仍保留顶层 `group_id` / `seq` / `message_id` / `sender_aid` 等别名,下一个大版本 0.5.* 将移除这些顶层别名。
2132
-
2133
- | 字段 | 类型 | 说明 |
2134
- |------|------|------|
2135
- | `envelope` | object | 撤回 tombstone / 通知自身信封,包含 `group_id`、`from`、`type`、`kind`、`timestamp`、`encrypted`、`context`、`protected_headers` 等存在的字段 |
2136
- | `module_id` | string | 固定 `"group"` |
2137
- | `group_id` | string | 群组 ID |
2138
- | `seq` | integer | 当前交付的撤回 tombstone / 通知 seq;在线 push 为 notice_seq,原 seq 占位 tombstone 为原消息 seq |
2139
- | `message_id` | string | 当前交付的撤回 tombstone / 通知自己的 message_id |
2140
- | `tombstone_message_id` | string | 兼容别名,等同于撤回 tombstone / 通知自身的 `message_id` |
2141
- | `message_ids` | string[] | 被撤回的**原消息 ID 列表** |
1792
+ }
1793
+ ```
1794
+
1795
+ SDK 交付给应用层的撤回事件同样带 `envelope`。`envelope` 表示当前交付的撤回 tombstone / 通知自身信封,不是被撤回原消息的信封;业务侧被撤回的原消息列表继续使用 `message_ids` / `target_message_seqs`。`message_id` / `seq` 继续只保留在顶层兼容字段中,不进入 `envelope`。0.4.x 兼容期仍保留顶层 `group_id` / `seq` / `message_id` / `sender_aid` 等别名,下一个大版本 0.5.* 将移除这些顶层别名。
1796
+
1797
+ | 字段 | 类型 | 说明 |
1798
+ |------|------|------|
1799
+ | `envelope` | object | 撤回 tombstone / 通知自身信封,包含 `group_id`、`from`、`type`、`kind`、`timestamp`、`encrypted`、`context`、`protected_headers` 等存在的字段 |
1800
+ | `module_id` | string | 固定 `"group"` |
1801
+ | `group_id` | string | 群组 ID |
1802
+ | `seq` | integer | 当前交付的撤回 tombstone / 通知 seq;在线 push 为 notice_seq,原 seq 占位 tombstone 为原消息 seq |
1803
+ | `message_id` | string | 当前交付的撤回 tombstone / 通知自己的 message_id |
1804
+ | `tombstone_message_id` | string | 兼容别名,等同于撤回 tombstone / 通知自身的 `message_id` |
1805
+ | `message_ids` | string[] | 被撤回的**原消息 ID 列表** |
2142
1806
  | `target_message_seqs` | integer[] | 被撤回的原消息 seq 列表 |
2143
1807
  | `sender_aid` | string | 原消息发送方 |
2144
1808
  | `recalled_by` | string | 撤回操作者 |
@@ -2168,7 +1832,10 @@ Group 服务定义了以下专用错误码(-33xxx 段):
2168
1832
  | -33005 | Not a member | 需先加入群组 |
2169
1833
  | -33006 | Invite code invalid or expired | 获取新邀请码 |
2170
1834
  | -33007 | Join request pending | 等待审批,勿重复提交 |
2171
- | -33008 | Resource not found | 检查 resource_path |
1835
+ | -33008 | Group FS path not found | 检查 path |
2172
1836
  | -33009 | Resource request not found | 检查 request_id |
2173
1837
 
2174
1838
  > SDK 客户端将 -33001 映射为 `GroupNotFoundError`,-33002~-33003 映射为 `GroupStateError`,其余映射为 `GroupError`。未识别的错误码 fallback 到 `AUNError`。
1839
+
1840
+
1841
+