@agentunion/fastaun-browser 0.5.0 → 0.5.2

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 (140) hide show
  1. package/CHANGELOG.md +550 -464
  2. package/_packed_docs/CHANGELOG-validators.md +147 -0
  3. package/_packed_docs/CHANGELOG.md +550 -464
  4. package/_packed_docs/INDEX.md +201 -177
  5. package/_packed_docs/KITE_DOCS_GUIDE.md +38 -32
  6. 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 +169 -116
  7. package/_packed_docs/aun-perf-audit-critical-bugs.md +315 -0
  8. package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +263 -260
  9. package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +331 -0
  10. package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +2 -2
  11. 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 +1 -1
  12. 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 +39 -16
  13. package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +8 -5
  14. package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +18 -19
  15. 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 +1 -1
  16. package/_packed_docs/protocol/08-AUN-E2EE-Group.md +139 -746
  17. package/_packed_docs/protocol/08-AUN-E2EE.md +12 -10
  18. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +117 -171
  19. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +6 -0
  20. 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 +1 -1
  21. 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
  22. package/_packed_docs/protocol/README.md +5 -4
  23. package/_packed_docs/protocol/aun-docs-guide.md +2 -2
  24. package/_packed_docs/protocol/index.md +12 -7
  25. 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 +1 -1
  26. package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +13 -13
  27. package/_packed_docs/protocol//351/231/204/345/275/225L-E2EE/345/256/236/347/216/260/346/214/207/345/215/227.md +9 -9
  28. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +15 -13
  29. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +26 -18
  30. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +35 -284
  31. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +473 -442
  32. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +11 -7
  33. package/_packed_docs/sdk/09-collab-rpc-manual.md +581 -550
  34. package/_packed_docs/sdk/09-group-rpc-manual.md +367 -433
  35. package/_packed_docs/sdk/09-message-rpc-manual.md +50 -28
  36. package/_packed_docs/sdk/09-payload-reference.md +3 -3
  37. package/_packed_docs/sdk/09-storage-rpc-manual.md +57 -20
  38. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +18 -17
  39. 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 +3 -2
  40. package/_packed_docs/sdk/INDEX.md +25 -24
  41. package/_packed_docs/sdk/Notify/351/200/232/347/237/245/346/226/271/346/241/210.md +6 -2
  42. package/dist/agent-md.d.ts.map +1 -1
  43. package/dist/agent-md.js +18 -9
  44. package/dist/agent-md.js.map +1 -1
  45. package/dist/bundle.js +1661 -1180
  46. package/dist/client/delivery.d.ts +13 -2
  47. package/dist/client/delivery.d.ts.map +1 -1
  48. package/dist/client/delivery.js +251 -46
  49. package/dist/client/delivery.js.map +1 -1
  50. package/dist/client/group-state.d.ts.map +1 -1
  51. package/dist/client/group-state.js +36 -14
  52. package/dist/client/group-state.js.map +1 -1
  53. package/dist/client/lifecycle.js +2 -2
  54. package/dist/client/lifecycle.js.map +1 -1
  55. package/dist/client/rpc-pipeline.d.ts +1 -0
  56. package/dist/client/rpc-pipeline.d.ts.map +1 -1
  57. package/dist/client/rpc-pipeline.js +166 -50
  58. package/dist/client/rpc-pipeline.js.map +1 -1
  59. package/dist/client/v2-e2ee.d.ts +14 -1
  60. package/dist/client/v2-e2ee.d.ts.map +1 -1
  61. package/dist/client/v2-e2ee.js +376 -126
  62. package/dist/client/v2-e2ee.js.map +1 -1
  63. package/dist/client.d.ts +5 -4
  64. package/dist/client.d.ts.map +1 -1
  65. package/dist/client.js +187 -46
  66. package/dist/client.js.map +1 -1
  67. package/dist/collab/client.d.ts +8 -0
  68. package/dist/collab/client.d.ts.map +1 -1
  69. package/dist/collab/client.js +12 -0
  70. package/dist/collab/client.js.map +1 -1
  71. package/dist/errors.d.ts +0 -20
  72. package/dist/errors.d.ts.map +1 -1
  73. package/dist/errors.js +8 -51
  74. package/dist/errors.js.map +1 -1
  75. package/dist/facades.d.ts +9 -4
  76. package/dist/facades.d.ts.map +1 -1
  77. package/dist/facades.js +192 -31
  78. package/dist/facades.js.map +1 -1
  79. package/dist/group-fs.d.ts +17 -0
  80. package/dist/group-fs.d.ts.map +1 -1
  81. package/dist/group-fs.js +54 -11
  82. package/dist/group-fs.js.map +1 -1
  83. package/dist/group-id.d.ts +9 -12
  84. package/dist/group-id.d.ts.map +1 -1
  85. package/dist/group-id.js +41 -63
  86. package/dist/group-id.js.map +1 -1
  87. package/dist/index.d.ts +4 -2
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +4 -1
  90. package/dist/index.js.map +1 -1
  91. package/dist/keystore/index.d.ts +2 -54
  92. package/dist/keystore/index.d.ts.map +1 -1
  93. package/dist/keystore/indexeddb-identity-store.d.ts +3 -0
  94. package/dist/keystore/indexeddb-identity-store.d.ts.map +1 -1
  95. package/dist/keystore/indexeddb-identity-store.js +65 -0
  96. package/dist/keystore/indexeddb-identity-store.js.map +1 -1
  97. package/dist/keystore/indexeddb-shared.d.ts +3 -17
  98. package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
  99. package/dist/keystore/indexeddb-shared.js +4 -47
  100. package/dist/keystore/indexeddb-shared.js.map +1 -1
  101. package/dist/keystore/indexeddb-token-store.d.ts +1 -64
  102. package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
  103. package/dist/keystore/indexeddb-token-store.js +45 -774
  104. package/dist/keystore/indexeddb-token-store.js.map +1 -1
  105. package/dist/logger.d.ts +2 -0
  106. package/dist/logger.d.ts.map +1 -1
  107. package/dist/logger.js +4 -0
  108. package/dist/logger.js.map +1 -1
  109. package/dist/storage/lowlevel.d.ts +9 -1
  110. package/dist/storage/lowlevel.d.ts.map +1 -1
  111. package/dist/storage/lowlevel.js +12 -1
  112. package/dist/storage/lowlevel.js.map +1 -1
  113. package/dist/storage/vfs.d.ts +22 -0
  114. package/dist/storage/vfs.d.ts.map +1 -1
  115. package/dist/storage/vfs.js +54 -0
  116. package/dist/storage/vfs.js.map +1 -1
  117. package/dist/tools/cross-sdk-agent.js +336 -49
  118. package/dist/tools/cross-sdk-agent.js.map +1 -1
  119. package/dist/transport.d.ts +2 -0
  120. package/dist/transport.d.ts.map +1 -1
  121. package/dist/transport.js +96 -3
  122. package/dist/transport.js.map +1 -1
  123. package/dist/types.d.ts +39 -56
  124. package/dist/types.d.ts.map +1 -1
  125. package/dist/v2/session/session.d.ts +2 -0
  126. package/dist/v2/session/session.d.ts.map +1 -1
  127. package/dist/v2/session/session.js +58 -22
  128. package/dist/v2/session/session.js.map +1 -1
  129. package/dist/v2/state/commitment.d.ts +1 -1
  130. package/dist/v2/state/commitment.d.ts.map +1 -1
  131. package/dist/v2/state/commitment.js +5 -3
  132. package/dist/v2/state/commitment.js.map +1 -1
  133. package/dist/validators.d.ts +35 -0
  134. package/dist/validators.d.ts.map +1 -0
  135. package/dist/validators.js +127 -0
  136. package/dist/validators.js.map +1 -0
  137. package/dist/version.d.ts +1 -1
  138. package/dist/version.js +1 -1
  139. package/package.json +1 -1
  140. package/_packed_docs/collab-gateway-boundary-test-report.md +0 -164
@@ -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,63 +95,59 @@
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 纪元 |
103
+ | [group.set_settings](#groupset_settings) | 统一设置群参数(含公告、规则、入群要求、dispatch_mode 等) |
104
+ | [group.get_settings](#groupget_settings) | 统一读取群参数 |
105
+
106
+ **便利方法**:SDK 提供向后兼容的便利方法(`getAnnouncement`/`updateAnnouncement`/`getRules`/`updateRules`/`getJoinRequirements`/`updateJoinRequirements`),内部调用 `set_settings`/`get_settings`,返回旧格式。新代码建议直接使用 `set_settings`/`get_settings`。
107
107
 
108
- ### 公告与规则
108
+ ### 群文件系统
109
109
 
110
110
  | 方法 | 说明 |
111
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) | 更新入群要求 |
118
-
119
- ### 群文件系统
120
-
121
- | 方法 | 说明 |
122
- |------|------|
123
- | [group.fs.ls](#groupfsls) | 列出目录 |
124
- | [group.fs.find](#groupfsfind) | 查找节点 |
125
- | [group.fs.stat](#groupfsstat) | 查看节点 |
126
- | [group.fs.lstat](#groupfslstat) | 查看链接本身 |
127
- | [group.fs.df](#groupfsdf) | 查看用量 |
128
- | [group.fs.create_download_ticket](#groupfscreate_download_ticket) | 创建下载票据 |
129
- | [group.fs.mkdir](#groupfsmkdir) | 创建目录 |
130
- | [group.fs.rm](#groupfsrm) | 删除节点 |
131
- | [group.fs.cp](#groupfscp) | 远程复制 |
132
- | [group.fs.mv](#groupfsmv) | 远程移动 |
133
- | [group.fs.check_upload](#groupfscheck_upload) | 上传前检查 |
134
- | [group.fs.create_upload_session](#groupfscreate_upload_session) | 创建上传会话 |
135
- | [group.fs.complete_upload](#groupfscomplete_upload) | 完成上传 |
136
- | [group.fs.mount](#groupfsmount) | 挂载成员数据区 |
137
- | [group.fs.umount](#groupfsumount) | 卸载成员数据区 |
138
-
139
- ### 在线状态
140
-
141
- | 方法 | 说明 |
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) | 卸载成员数据区 |
131
+
132
+ ### 在线状态
133
+
134
+ | 方法 | 说明 |
142
135
  |------|------|
143
136
  | [group.get_online_members](#groupget_online_members) | 在线成员 |
144
137
 
145
138
  ---
146
139
 
147
- ## Group ID 规范
148
-
149
- `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,避免同一群的不同别名产生不同材料。
140
+ ## Group AID / Group ID 兼容规范
150
141
 
151
- 兼容输入包括 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` 参数说明。
142
+ 目标态群组主标识是 `group_aid`,canonical 形式为 `{base}.{issuer-domain}`,例如 `10042.agentid.pub`、`team01.agentid.pub`、`g-abc123.agentid.pub`。新建群以 `group_aid` 为准;新群的兼容 `group_id` 列值也使用同一个 `group_aid` 字符串。历史 `group_id` 字段名和 RPC 参数名继续保留,但语义上只是兼容字段。
152
143
 
153
- `group.create` 可以指定自定义 `group_id`,但不能是纯数字(纯数字群号保留给服务端自动分配),且规范化后的 canonical group_id 未被占用;如果已被占用或与旧别名碰撞会返回错误。不指定 `group_id` 时服务端按群号自动分配,并通过唯一约束兜底,发现碰撞会重新生成。
144
+ SDK 发起 `group.*` 调用时会把传入的 `group_id` / `groupId` / `group_aid` / `groupAid` 统一规范化为 `group_aid`。裸客户端也应使用同一 `group_aid` 生成签名材料和 E2EE AAD,避免同一群的历史别名产生不同材料。服务端响应可能同时返回 `group_id` 和 `group_aid`;新代码应优先读取 `group_aid`,仅兼容旧版本或历史数据时回退读取 `group_id`。
154
145
 
155
- `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`。
146
+ 兼容输入包括目标态 `{base}.{issuer-domain}`、本域简写 `{base}` / `g-{slug}`,以及旧格式 `group.{issuer-domain}/{base}`、`{base}@issuer-domain`、`g-{slug}@issuer-domain`、`g-{slug}.{issuer-domain}`。带域的旧输入会转换为 `{base}.{issuer-domain}`;本域简写会在服务端或 SDK 有本域 issuer 配置时补成本域 `group_aid`。`base` 支持 5 位及以上小写字母或数字,或 4 到 64 位 `[a-z0-9_-]` 风格名称;旧 `g-` 前缀形式继续兼容,`g-` 后为 4 到 32 位小写字母或数字。命名群使用 `group_name` 作为 base,规则见 `group.create` 参数说明。
147
+
148
+ `group.create` 的新建语义以 `group_aid` 为准:命名群由 `group_name + issuer` 生成 `group_aid`,自动群由服务端群号生成 `{number}.{issuer}`。`group_id` 参数只作为旧客户端兼容别名;传入时不能是纯数字(纯数字群号保留给服务端自动分配),且规范化后的 `group_aid` 未被占用。如果已被占用或与历史别名碰撞会返回错误。
149
+
150
+ 在 `https://group.issuer-domain/...` 这类群链接中,path 使用单段 `group_aid`,例如 `https://group.agentid.pub/10042.agentid.pub/invite/ic-xxx`、`https://group.agentid.pub/g-abc123.agentid.pub/invite/ic-xxx`。历史 base 简写链接可继续由服务端兼容解析。
156
151
 
157
152
  ---
158
153
 
@@ -160,15 +155,16 @@
160
155
 
161
156
  ### group.create
162
157
 
163
- 创建群组。调用者自动成为 owner。支持创建命名群(传入 `group_name` + `public_key`)。
158
+ 创建群组。调用者自动成为 owner。支持创建命名群(传入 `group_name` + `public_key`)。新建群主标识以 `group_aid` 为准;`group_id` 仅作为兼容字段保留。
164
159
 
165
160
  **参数**:
166
161
 
167
162
  | 参数 | 类型 | 必填 | 说明 |
168
163
  |------|------|------|------|
169
164
  | `name` | string | 是 | 群组显示名称 |
170
- | `group_id` | string | 否 | 自定义群 ID;不提供则服务端自动生成 |
171
- | `group_name` | string | 否 | 命名群标识,4-64 字符,`[a-z0-9_-]+`,不以 `guest`/`g-` 开头。与 `public_key` 同时提供时创建命名群 |
165
+ | `group_aid` | string | 否 | 目标态群 AID;新代码优先使用。传入时会规范化为 `{base}.{issuer-domain}`,不能是纯数字 |
166
+ | `group_id` | string | 否 | 兼容旧客户端的别名;值语义同 `group_aid`,不再推荐新代码使用 |
167
+ | `group_name` | string | 否 | 命名群标识,4-64 字符,`[a-z0-9_-]+`,不以 `guest`/`g-` 开头。与 `public_key` 同时提供时创建命名群,并生成 `{group_name}.{issuer-domain}` |
172
168
  | `public_key` | string | 否 | 命名群公钥(base64 编码),与 `group_name` 同时提供 |
173
169
  | `curve` | string | 否 | 密钥曲线,默认 `"P-256"` |
174
170
  | `visibility` | string | 否 | `"public"` / `"private"`,默认由配置决定 |
@@ -185,7 +181,8 @@
185
181
  ```json
186
182
  {
187
183
  "group": {
188
- "group_id": "group.agentid.pub/10001",
184
+ "group_id": "my-team.agentid.pub",
185
+ "group_aid": "my-team.agentid.pub",
189
186
  "name": "测试群",
190
187
  "owner_aid": "alice.agentid.pub",
191
188
  "creator_aid": "alice.agentid.pub",
@@ -196,10 +193,9 @@
196
193
  "member_count": 1,
197
194
  "message_seq": 0,
198
195
  "event_seq": 0,
199
- "group_url": "https://group.agentid.pub/10001",
200
- "group_aid": "my-team.agentid.pub",
201
- "created_at": 1234567890,
202
- "updated_at": 1234567890
196
+ "group_url": "https://group.agentid.pub/my-team.agentid.pub",
197
+ "created_at": 1234567890000,
198
+ "updated_at": 1234567890000
203
199
  },
204
200
  "aid_cert": {
205
201
  "cert": "-----BEGIN CERTIFICATE-----...",
@@ -211,9 +207,9 @@
211
207
  }
212
208
  ```
213
209
 
214
- > `aid_cert` 仅在命名群创建时返回。`group_aid` `group_url` 仅在命名群时存在。
215
-
216
- **Group ID 格式**:新格式 `group.{issuer}/{group_no_or_name}`,旧格式 `{digits}.{issuer}` API 返回时自动转换。
210
+ > `aid_cert` 仅在命名群创建时返回。`group_aid` 是新代码应使用的主标识;`group_id` 为兼容字段,新群通常与 `group_aid` 相同,历史群可能保留旧存储值。
211
+
212
+ **标识格式**:目标态为 `{base}.{issuer-domain}`。旧格式 `group.{issuer-domain}/{base}`、`{base}@{issuer-domain}` 会在 API 边界转换为目标态 `group_aid`。
217
213
 
218
214
  ### group.bind_aid
219
215
 
@@ -223,7 +219,7 @@
223
219
 
224
220
  | 参数 | 类型 | 必填 | 说明 |
225
221
  |------|------|------|------|
226
- | `group_id` | string | 是 | 群组 ID |
222
+ | `group_id` | string | 是 | 群组标识;兼容参数名,值使用目标态 `group_aid` |
227
223
  | `group_name` | string | 是 | 命名群标识,4-64 字符,`[a-z0-9_-]+` |
228
224
  | `public_key` | string | 是 | 群公钥(base64 编码) |
229
225
  | `curve` | string | 否 | 密钥曲线,默认 `"P-256"` |
@@ -237,27 +233,36 @@
237
233
  }
238
234
  ```
239
235
 
240
- ### group.get
236
+ ### group.get_info
241
237
 
242
- 查询群组信息。
238
+ 查询群组信息,返回平铺格式。默认返回公开字段;需要成员或管理员权限的字段必须通过 `required` 显式声明。
243
239
 
244
240
  **参数**:
245
241
 
246
242
  | 参数 | 类型 | 必填 | 说明 |
247
243
  |------|------|------|------|
248
- | `group_id` | string | 是 | 群组 ID |
244
+ | `group_id` | string | 是 | 群组标识;兼容参数名,值使用目标态 `group_aid` |
245
+ | `required` | string[] | 否 | 受限字段声明:`member`、`state`、`e2ee`、`avatar` |
249
246
 
250
- **响应**:
247
+ **默认响应**:
251
248
 
252
249
  ```json
253
250
  {
254
251
  "found": true,
255
252
  "group_id": "g-abc123.agentid.pub",
256
- "group": { ... }
253
+ "group_aid": "g-abc123.agentid.pub",
254
+ "name": "开发讨论组",
255
+ "visibility": "public",
256
+ "status": "active",
257
+ "description": "技术讨论群",
258
+ "member_count": 42,
259
+ "created_at": 1234567890000
257
260
  }
258
261
  ```
259
262
 
260
- > 若群组不存在,`found` `false`,`group` 为 `null`。
263
+ `required=["member"]` 会额外返回 `owner_aid`、`creator_aid`、`message_seq`、`event_seq`、`e2ee_epoch`、`updated_at`、`my_role` 等成员可见字段。
264
+
265
+ > `group.get` 和 `group.info` 已合并到 `group.get_info`;`group.get_info` 默认行为等价于原公开信息查询。
261
266
 
262
267
  ### group.update
263
268
 
@@ -267,7 +272,7 @@
267
272
 
268
273
  | 参数 | 类型 | 必填 | 说明 |
269
274
  |------|------|------|------|
270
- | `group_id` | string | 是 | 群组 ID |
275
+ | `group_id` | string | 是 | 群组标识;兼容参数名,值使用目标态 `group_aid` |
271
276
  | `name` | string | 否 | 新名称 |
272
277
  | `visibility` | string | 否 | 新可见性 |
273
278
  | `description` | string | 否 | 新描述 |
@@ -296,7 +301,7 @@
296
301
  "name": "项目讨论",
297
302
  "visibility": "private",
298
303
  "member_count": 5,
299
- "updated_at": 1234567890,
304
+ "updated_at": 1234567890000,
300
305
  "role": "owner"
301
306
  }
302
307
  ],
@@ -334,26 +339,11 @@
334
339
 
335
340
  > **注意**:当前 `page` 固定为 1,不支持翻页。仅返回公开群组。
336
341
 
337
- ### group.get_public_info
338
-
339
- 查询公开群组信息。仅限 `visibility=public` 的群组可查询。
340
-
341
- **参数**:`group_id` (string, 必填)
342
-
343
- **响应**:
344
-
345
- ```json
346
- {
347
- "group_id": "g-abc123.agentid.pub",
348
- "group": { ... }
349
- }
350
- ```
351
-
352
342
  ### group.suspend
353
343
 
354
344
  暂停群组。暂停期间不能发送消息。需要 **admin 及以上**权限。
355
345
 
356
- **参数**:`group_id` (string, 必填)
346
+ **参数**:`group_id`(string,必填;兼容字段,值使用目标态 `group_aid`)
357
347
 
358
348
  **响应**:
359
349
 
@@ -370,7 +360,7 @@
370
360
 
371
361
  恢复暂停的群组。需要 **admin 及以上**权限。
372
362
 
373
- **参数**:`group_id` (string, 必填)
363
+ **参数**:`group_id`(string,必填;兼容字段,值使用目标态 `group_aid`)
374
364
 
375
365
  **响应**:
376
366
 
@@ -387,7 +377,7 @@
387
377
 
388
378
  永久解散群组。不可恢复。需要 **owner** 权限。
389
379
 
390
- **参数**:`group_id` (string, 必填)
380
+ **参数**:`group_id`(string,必填;兼容字段,值使用目标态 `group_aid`)
391
381
 
392
382
  **响应**:
393
383
 
@@ -398,29 +388,6 @@
398
388
  }
399
389
  ```
400
390
 
401
- ### group.get_stats
402
-
403
- 获取群组统计信息。需要 **admin 及以上**权限。
404
-
405
- **参数**:`group_id` (string, 必填)
406
-
407
- **响应**:
408
-
409
- ```json
410
- {
411
- "group_id": "g-abc123.agentid.pub",
412
- "status": "active",
413
- "member_count": 42,
414
- "message_seq": 1000,
415
- "event_seq": 500,
416
- "pending_join_request_count": 3,
417
- "active_invite_code_count": 2,
418
- "ban_count": 1,
419
- "online_count": 10,
420
- "runtime_stats": { ... },
421
- "cleanup": { ... }
422
- }
423
- ```
424
391
 
425
392
  ---
426
393
 
@@ -434,7 +401,7 @@
434
401
 
435
402
  | 参数 | 类型 | 必填 | 说明 |
436
403
  |------|------|------|------|
437
- | `group_id` | string | 是 | 群组 ID |
404
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
438
405
  | `aid` | string | 是 | 要添加的 AID |
439
406
  | `role` | string | 否 | `"admin"` / `"member"`,默认 `"member"` |
440
407
  | `member_type` | string | 否 | `"human"` / `"ai"`,默认 `"human"` |
@@ -448,7 +415,7 @@
448
415
  "aid": "bob.agentid.pub",
449
416
  "role": "member",
450
417
  "member_type": "human",
451
- "joined_at": 1234567890
418
+ "joined_at": 1234567890000
452
419
  }
453
420
  }
454
421
  ```
@@ -461,7 +428,7 @@
461
428
 
462
429
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
463
430
  |------|------|------|--------|------|
464
- | `group_id` | string | 是 | — | 群组 ID |
431
+ | `group_id` | string | 是 | — | 群组标识;兼容字段,值语义为目标态 `group_aid` |
465
432
  | `page` | integer | 否 | 1 | 页码 |
466
433
  | `size` | integer | 否 | 50 | 每页条数(最大 200) |
467
434
  | `role` | string | 否 | — | 按角色过滤(owner/admin/member) |
@@ -477,9 +444,9 @@
477
444
  "aid": "alice.agentid.pub",
478
445
  "role": "owner",
479
446
  "member_type": "human",
480
- "joined_at": 1234567890,
447
+ "joined_at": 1234567890000,
481
448
  "last_ack_seq": 100,
482
- "last_pull_at": 1234567890
449
+ "last_pull_at": 1234567890000
483
450
  }
484
451
  ],
485
452
  "total": 1,
@@ -497,7 +464,7 @@
497
464
 
498
465
  | 参数 | 类型 | 必填 | 说明 |
499
466
  |------|------|------|------|
500
- | `group_id` | string | 是 | 群组 ID |
467
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
501
468
  | `aid` | string | 是 | 要踢出的 AID |
502
469
 
503
470
  **响应**:
@@ -513,7 +480,7 @@
513
480
 
514
481
  主动退出群组。owner 不能直接退群,需先转让群主。
515
482
 
516
- **参数**:`group_id` (string, 必填)
483
+ **参数**:`group_id`(string,必填;兼容字段,值使用目标态 `group_aid`)
517
484
 
518
485
  **响应**:
519
486
 
@@ -526,13 +493,13 @@
526
493
 
527
494
  ### group.set_role
528
495
 
529
- 设置成员角色。需要 **owner** 权限。不能改变 owner 角色。
496
+ 设置成员角色。需要 **owner** 权限。不能改变 owner 角色。该 RPC 只改变 membership 中的角色事实,不授予或撤销群自有区写 ACL;`role:admin` 是否可写群自有区由 `group.fs.set_acl` / `group.fs.remove_acl` 显式控制。
530
497
 
531
498
  **参数**:
532
499
 
533
500
  | 参数 | 类型 | 必填 | 说明 |
534
501
  |------|------|------|------|
535
- | `group_id` | string | 是 | 群组 ID |
502
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
536
503
  | `aid` | string | 是 | 目标 AID |
537
504
  | `role` | string | 是 | `"admin"` / `"member"` |
538
505
 
@@ -540,16 +507,20 @@
540
507
 
541
508
  ```json
542
509
  {
543
- "group_id": "g-abc123.agentid.pub",
510
+ "group": { ... },
544
511
  "member": {
545
512
  "group_id": "g-abc123.agentid.pub",
546
513
  "aid": "bob.agentid.pub",
547
514
  "role": "admin",
548
515
  "member_type": "human",
549
- "joined_at": 1234567890,
516
+ "joined_at": 1234567890000,
550
517
  "last_ack_seq": 0,
551
518
  "last_pull_at": 0
552
- }
519
+ },
520
+ "old_role": "member",
521
+ "new_role": "admin",
522
+ "acl_model": "role_based",
523
+ "acl_policy": "unchanged"
553
524
  }
554
525
  ```
555
526
 
@@ -561,7 +532,7 @@
561
532
 
562
533
  | 参数 | 类型 | 必填 | 说明 |
563
534
  |------|------|------|------|
564
- | `group_id` | string | 是 | 群组 ID |
535
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
565
536
  | `new_owner` | string | 是 | 新群主 AID(也接受 `aid`) |
566
537
 
567
538
  **响应**:
@@ -574,6 +545,113 @@
574
545
  }
575
546
  ```
576
547
 
548
+ ### group.bind_group_aid
549
+
550
+ 为匿名群绑定群身份(group_aid)。需要 owner 权限。
551
+
552
+ **幂等保证**:
553
+ - 已绑定且公钥匹配:返回已绑定的 group_aid 和证书
554
+ - 已绑定但公钥不同:报错 `group_aid_already_bound_different_key`
555
+ - 未绑定:签发新 group_aid 并绑定
556
+
557
+ **参数**:
558
+
559
+ | 参数 | 类型 | 必填 | 说明 |
560
+ |------|------|------|------|
561
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
562
+ | `public_key` | string | 是 | 公钥 DER base64(SPKI 格式) |
563
+ | `curve` | string | 否 | 曲线名称(默认 P-256) |
564
+
565
+ **响应**:
566
+
567
+ ```json
568
+ {
569
+ "group": {
570
+ "group_id": "my-team.agentid.pub",
571
+ "group_aid": "my-team.agentid.pub",
572
+ ...
573
+ },
574
+ "aid_cert": {
575
+ "cert": "-----BEGIN CERTIFICATE-----...",
576
+ "agentid": "my-team.agentid.pub"
577
+ }
578
+ }
579
+ ```
580
+
581
+ **SDK 封装**:
582
+
583
+ 各语言 SDK 的 `bindGroupAid` 方法已实现幂等逻辑:
584
+ 1. 优先从 pending 槽位加载暂存密钥(崩溃恢复)
585
+ 2. 未命中则生成新密钥并暂存到 pending 槽位
586
+ 3. 调用 RPC 成功后导入 group_aid 身份并清理 pending 槽位
587
+
588
+ ### group.renew_group_aid
589
+
590
+ 轮换群身份密钥。需要 owner 权限,且必须持有旧 group_aid 私钥。
591
+
592
+ **用途**:
593
+ - 群主密钥泄露后的安全轮换
594
+ - 定期密钥更新符合安全策略
595
+
596
+ **验证**:
597
+ - 服务端验证 `renew_proof` 签名(用旧私钥签名 canonical payload)
598
+ - 验证 `old_public_key` 与当前 group_aid 证书匹配
599
+ - 签发新证书并更新 group_aid
600
+
601
+ **参数**:
602
+
603
+ | 参数 | 类型 | 必填 | 说明 |
604
+ |------|------|------|------|
605
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
606
+ | `group_aid` | string | 否 | 群身份 AID(可选,服务端可推导) |
607
+ | `old_public_key` | string | 是 | 旧公钥 DER base64 |
608
+ | `new_public_key` | string | 是 | 新公钥 DER base64 |
609
+ | `curve` | string | 否 | 新密钥曲线(默认 P-256) |
610
+ | `renew_proof` | object | 是 | 轮换授权签名 |
611
+
612
+ **renew_proof 结构**:
613
+
614
+ ```json
615
+ {
616
+ "nonce": "随机 nonce(32 字符十六进制)",
617
+ "issued_ms": 1234567890000,
618
+ "signature": "用旧私钥签名的 base64"
619
+ }
620
+ ```
621
+
622
+ **签名 canonical payload**:
623
+
624
+ ```
625
+ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(new_public_key)}|{nonce}|{issued_ms}
626
+ ```
627
+
628
+ 所有字段小写,用 `|` 分隔。
629
+
630
+ **响应**:
631
+
632
+ ```json
633
+ {
634
+ "group": {
635
+ "group_id": "my-team.agentid.pub",
636
+ "group_aid": "my-team.agentid.pub",
637
+ ...
638
+ },
639
+ "aid_cert": {
640
+ "cert": "-----BEGIN CERTIFICATE-----...",
641
+ "agentid": "my-team.agentid.pub"
642
+ },
643
+ "old_cert_revoked": true
644
+ }
645
+ ```
646
+
647
+ **SDK 封装**:
648
+
649
+ 各语言 SDK 的 `renewGroupAid` 方法自动处理:
650
+ 1. 加载旧 group_aid 私钥
651
+ 2. 生成新密钥对
652
+ 3. 用旧私钥签名 canonical payload
653
+ 4. 调用 RPC 并用新密钥覆盖本地 group_aid 身份
654
+
577
655
  ### group.ban
578
656
 
579
657
  封禁成员。被封禁者禁止发消息但保留成员身份,且不能重新加入(如先被移除再封禁)。需要 **admin 及以上**权限。
@@ -582,7 +660,7 @@
582
660
 
583
661
  | 参数 | 类型 | 必填 | 说明 |
584
662
  |------|------|------|------|
585
- | `group_id` | string | 是 | 群组 ID |
663
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
586
664
  | `subject` | string | 是 | 要封禁的 AID(也接受 `aid`) |
587
665
  | `reason` | string | 否 | 封禁原因 |
588
666
  | `expires_at` | integer | 否 | 过期时间戳(0 = 永久) |
@@ -599,7 +677,7 @@
599
677
  "banned_by": "alice.agentid.pub",
600
678
  "reason": "垃圾消息",
601
679
  "expires_at": 0,
602
- "created_at": 1234567890
680
+ "created_at": 1234567890000
603
681
  }
604
682
  }
605
683
  ```
@@ -608,7 +686,7 @@
608
686
 
609
687
  解除封禁。需要 **admin 及以上**权限。
610
688
 
611
- **参数**:`group_id` (string), `subject` 或 `aid` (string)
689
+ **参数**:`group_id`(string,兼容字段,值使用目标态 `group_aid`),`subject` 或 `aid` (string)
612
690
 
613
691
  **响应**:
614
692
 
@@ -624,7 +702,7 @@
624
702
 
625
703
  获取封禁列表。需要 **admin 及以上**权限。
626
704
 
627
- **参数**:`group_id` (string, 必填)
705
+ **参数**:`group_id`(string,必填;兼容字段,值使用目标态 `group_aid`)
628
706
 
629
707
  **响应**:
630
708
 
@@ -638,7 +716,7 @@
638
716
  "banned_by": "alice.agentid.pub",
639
717
  "reason": "垃圾消息",
640
718
  "expires_at": 0,
641
- "created_at": 1234567890
719
+ "created_at": 1234567890000
642
720
  }
643
721
  ],
644
722
  "total": 1,
@@ -659,7 +737,7 @@
659
737
 
660
738
  | 参数 | 类型 | 必填 | 说明 |
661
739
  |------|------|------|------|
662
- | `group_id` | string | 是 | 群组 ID |
740
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
663
741
  | `message` | string | 否 | 申请留言 |
664
742
  | `answer` | string | 否 | 入群问题的答案 |
665
743
 
@@ -695,8 +773,8 @@
695
773
  "message": "请加我",
696
774
  "answer": "...",
697
775
  "status": "pending",
698
- "created_at": 1234567890,
699
- "updated_at": 1234567890,
776
+ "created_at": 1234567890000,
777
+ "updated_at": 1234567890000,
700
778
  "expires_at": 1234654290,
701
779
  "reviewed_by": null,
702
780
  "rejection_reason": null
@@ -712,7 +790,7 @@
712
790
 
713
791
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
714
792
  |------|------|------|--------|------|
715
- | `group_id` | string | 是 | — | 群组 ID |
793
+ | `group_id` | string | 是 | — | 群组标识;兼容字段,值语义为目标态 `group_aid` |
716
794
  | `status` | string | 否 | `"pending"` | `"pending"` / `"approved"` / `"rejected"` |
717
795
  | `page` | integer | 否 | 1 | 页码 |
718
796
  | `size` | integer | 否 | — | 每页数量 |
@@ -728,8 +806,8 @@
728
806
  "aid": "carol.agentid.pub",
729
807
  "message": "请加我",
730
808
  "status": "pending",
731
- "created_at": 1234567890,
732
- "updated_at": 1234567890
809
+ "created_at": 1234567890000,
810
+ "updated_at": 1234567890000
733
811
  }
734
812
  ],
735
813
  "total": 1,
@@ -746,7 +824,7 @@
746
824
 
747
825
  | 参数 | 类型 | 必填 | 说明 |
748
826
  |------|------|------|------|
749
- | `group_id` | string | 是 | 群组 ID |
827
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
750
828
  | `aid` | string | 是 | 申请人 AID |
751
829
  | `approve` | boolean | 否 | 批准或拒绝,默认 `true` |
752
830
  | `reason` | string | 否 | 拒绝原因 |
@@ -784,7 +862,7 @@
784
862
 
785
863
  | 参数 | 类型 | 必填 | 说明 |
786
864
  |------|------|------|------|
787
- | `group_id` | string | 是 | 群组 ID |
865
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
788
866
  | `requests` | array | 是 | 审批列表 |
789
867
 
790
868
  `requests` 数组每项:
@@ -816,7 +894,7 @@
816
894
 
817
895
  | 参数 | 类型 | 必填 | 说明 |
818
896
  |------|------|------|------|
819
- | `group_id` | string | 是 | 群组 ID |
897
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
820
898
  | `code` | string | 否 | 自定义邀请码(不提供则自动生成) |
821
899
  | `max_uses` | integer | 否 | 最大使用次数,默认 1,必须 > 0 |
822
900
  | `expires_in_seconds` | integer | 否 | 有效期(秒),默认由 invite_code_ttl_days 配置(7 天) |
@@ -834,7 +912,7 @@
834
912
  "max_uses": 10,
835
913
  "used_count": 0,
836
914
  "status": "active",
837
- "created_at": 1234567890
915
+ "created_at": 1234567890000
838
916
  }
839
917
  }
840
918
  ```
@@ -859,13 +937,13 @@
859
937
 
860
938
  列出群组的邀请码。需要 admin 权限。
861
939
 
862
- **参数**:`group_id` (string, 必填)
940
+ **参数**:`group_id`(string,必填;兼容字段,值使用目标态 `group_aid`)
863
941
 
864
942
  ### group.revoke_invite_code
865
943
 
866
944
  撤销邀请码。需要 admin 权限。
867
945
 
868
- **参数**:`group_id` (string), `code` (string)
946
+ **参数**:`group_id`(string,兼容字段,值使用目标态 `group_aid`),`code` (string)
869
947
 
870
948
  ---
871
949
 
@@ -881,7 +959,7 @@
881
959
 
882
960
  | 参数 | 类型 | 必填 | 说明 |
883
961
  |------|------|------|------|
884
- | `group_id` | string | 是 | 群组 ID |
962
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
885
963
  | `settings` | object | 是 | 要写入的设置键值 |
886
964
  | `settings["dispatch_mode"]` | string | 否 | `"broadcast"` / `"mention"`,默认 `"broadcast"` |
887
965
  | `settings["rules.content"]` | string | 否 | 群规则正文 |
@@ -928,7 +1006,7 @@ await client.call("group.set_settings", {
928
1006
 
929
1007
  | 参数 | 类型 | 必填 | 说明 |
930
1008
  |------|------|------|------|
931
- | `group_id` | string | 是 | 群组 ID |
1009
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
932
1010
  | `keys` | array | 否 | 只读取指定 key,如 `["dispatch_mode", "rules.content"]` |
933
1011
 
934
1012
  **响应**:
@@ -942,32 +1020,6 @@ await client.call("group.set_settings", {
942
1020
  }
943
1021
  ```
944
1022
 
945
- ### group.get_dispatch_log
946
-
947
- 读取值班分发日志。成员可读,主要用于诊断 `dispatch.mode=duty`、超时回退、批量分发等运行时行为。
948
-
949
- **参数**:
950
-
951
- | 参数 | 类型 | 必填 | 默认值 | 说明 |
952
- |------|------|------|--------|------|
953
- | `group_id` | string | 是 | — | 群组 ID |
954
- | `date` | string | 否 | 当天 | 日志日期,格式由服务端日志文件名解析 |
955
- | `size` / `limit` | integer | 否 | 100 | 返回最后 N 条,最大 500 |
956
-
957
- **响应**:
958
-
959
- ```json
960
- {
961
- "group_id": "g-abc123.agentid.pub",
962
- "items": [],
963
- "total": 0,
964
- "page": 1,
965
- "size": 100
966
- }
967
- ```
968
-
969
- ---
970
-
971
1023
  ## 消息
972
1024
 
973
1025
  ### group.send
@@ -980,7 +1032,7 @@ await client.call("group.set_settings", {
980
1032
 
981
1033
  | 参数 | 类型 | 必填 | 说明 |
982
1034
  |------|------|------|------|
983
- | `group_id` | string | 是 | 群组 ID |
1035
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
984
1036
  | `payload` | object | 否 | 消息内容 |
985
1037
  | `type` | string | 否 | 信封/封装类型,普通业务消息无需填写;SDK 加密群消息时自动使用 `e2ee.group_encrypted` |
986
1038
  | `attachments` | array | 否 | 兼容旧接口的顶层附件元数据;推荐把业务附件放入 `payload.attachments` |
@@ -988,7 +1040,7 @@ await client.call("group.set_settings", {
988
1040
 
989
1041
  ### Payload 参考约定
990
1042
 
991
- `group.send.params.payload` 的统一业务负载格式见 [09-payload-reference](09-payload-reference.md)。完整群消息请求仍在 `payload` 同级传入 `group_id`;业务类型放在 `payload.type`,不要与 `group.send.params.type` 信封/封装类型混用。
1043
+ `group.send.params.payload` 的统一业务负载格式见 [09-payload-reference](09-payload-reference.md)。完整群消息请求仍在 `payload` 同级传入 `group_id`(兼容参数名,值使用目标态 `group_aid`);业务类型放在 `payload.type`,不要与 `group.send.params.type` 信封/封装类型混用。
992
1044
 
993
1045
  `protected_headers` 只在 SDK 加密路径生效;裸 RPC 发送明文或已加密信封时,调用方需自行遵守 [05-E2EE加密通信](05-E2EE加密通信.md#protectedheaders-与可验证上下文) 的格式和校验规则。
994
1046
 
@@ -1010,34 +1062,45 @@ await client.call("group.set_settings", {
1010
1062
  },
1011
1063
  "event": { ... },
1012
1064
  "dispatch_mode": "broadcast",
1013
- "dispatch": {"mode": "broadcast", "reason": "duty_disabled"},
1014
- "message_dispatch": { ... }
1015
- }
1016
- ```
1065
+ "dispatch": {"mode": "broadcast", "reason": "duty_disabled"},
1066
+ "message_dispatch": { ... },
1067
+ "envelope": {
1068
+ "from": "alice.agentid.pub",
1069
+ "group_id": "g-abc123.agentid.pub",
1070
+ "type": "text",
1071
+ "timestamp": 1234567890000,
1072
+ "encrypted": true,
1073
+ "payload_type": "text"
1074
+ },
1075
+ "payload": {"type": "text", "text": "Hello"}
1076
+ }
1077
+ ```
1017
1078
 
1018
1079
  | 字段 | 类型 | 说明 |
1019
1080
  |------|------|------|
1020
- | `group_id` | string | 群组 ID |
1081
+ | `group_id` | string | 兼容字段,值语义为目标态 `group_aid` |
1021
1082
  | `message` | object | 消息对象(含 seq、message_id、sender_aid 等) |
1022
1083
  | `event` | object | 关联的群事件对象 |
1023
1084
  | `dispatch_mode` | string | 群消息持久化分发模式标签:`"broadcast"` / `"mention"`;SDK 解密后也会注入到 `payload.dispatch_mode` |
1024
- | `dispatch` | object | 分发策略:`mode` 为 `"broadcast"`(广播全员)或 `"duty"`(值班分发);`reason` 说明原因(如 `"duty_disabled"` / `"active_duty"` / `"no_duty_candidate"` 等) |
1025
- | `duty_state` | object | 可选,值班模式下的当前状态 |
1026
- | `message_dispatch` | object | 运行时分发结果;常见 `status` 包括 `"broadcast"`、`"sent"`、`"queued_batch"`、`"debounced"`、`"skipped"`、`"failed"` |
1085
+ | `dispatch` | object | 分发策略:`mode` 为 `"broadcast"`(广播全员)或 `"duty"`(值班分发);`reason` 说明原因(如 `"duty_disabled"` / `"active_duty"` / `"no_duty_candidate"` 等) |
1086
+ | `duty_state` | object | 可选,值班模式下的当前状态 |
1087
+ | `message_dispatch` | object | 运行时分发结果;常见 `status` 包括 `"broadcast"`、`"sent"`、`"queued_batch"`、`"debounced"`、`"skipped"`、`"failed"` |
1088
+ | `envelope` | object | SDK 回填的发送结果信封,包含发送方、群标识、业务类型、时间戳、加密标志、protected headers 等可转发元数据 |
1089
+ | `payload` | object | SDK 回填的应用层业务 payload;裸 RPC 或内部 `_skip_send_result_envelope` 路径可能没有该字段 |
1027
1090
 
1028
1091
  ### group.thought.put
1029
1092
 
1030
1093
  写入某个发送者针对一个群上下文的思考内容。该内容不是普通群消息:服务端不分配消息 `seq`,不广播,不进入 `group.pull`,不需要 ack,也不持久化;只在内存中保留当前 head。
1031
1094
 
1032
- SDK 调用时必须走群组 E2EE。应用层传入明文 `payload`,SDK 会加密成 `e2ee.group_encrypted` 信封、补齐 `thought_id` / `timestamp`,并附加 `client_signature`。裸 WebSocket 客户端若绕过 SDK,则必须自行完成同等加密和签名。
1095
+ SDK 调用时必须走群组 E2EE。应用层传入明文 `payload`,SDK 会加密成 V2 `e2ee.group_encrypted` 信封、补齐 `thought_id` / `timestamp`,并附加 `client_signature`。裸 WebSocket 客户端若绕过 SDK,至少必须自行完成 V2 envelope、`sender_signature`、AAD 和 state commitment 生成;`client_signature` 按 Gateway 连接级身份语义携带。
1033
1096
 
1034
- 存储键为 `group_id + sender_aid + context.type + context.id`。其中 `sender_aid` 由服务端认证态派生,不能由客户端指定;`context` 是 thought head 的唯一 selector,推荐使用 `{"type": "run", "id": "run-xxx"}`。同一 `(group_id, sender_aid)` 保留最近 N 个 context 对应的 head,N 由群服务配置 `max_thought_heads_per_sender` 控制,当前默认值为 5;同一个 head 下可追加多条 thought item。
1097
+ 存储键为规范化后的 `group_aid + sender_aid + context.type + context.id`。RPC 字段名仍为 `group_id` 以兼容旧客户端,但服务端会先规范化为目标态群标识;`sender_aid` 由服务端认证态派生,不能由客户端指定;`context` 是 thought head 的唯一 selector,推荐使用 `{"type": "run", "id": "run-xxx"}`。同一 `(group_aid, sender_aid)` 保留最近 N 个 context 对应的 head,N 由群服务配置 `max_thought_heads_per_sender` 控制,当前默认值为 100;同一个 head 下可追加多条 thought item。
1035
1098
 
1036
1099
  **参数**:
1037
1100
 
1038
1101
  | 参数 | 类型 | 必填 | 说明 |
1039
1102
  |------|------|------|------|
1040
- | `group_id` | string | 是 | 群组 ID |
1103
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1041
1104
  | `context.type` | string | 是 | 思考的上下文类型,推荐 `run` |
1042
1105
  | `context.id` | string | 是 | 思考的上下文 ID,如 `run_id` |
1043
1106
  | `payload` | object | 是 | SDK 加密前的思考内容;推荐格式见 [09-payload-reference](09-payload-reference.md#thought思考内容) |
@@ -1065,7 +1128,7 @@ await client.call("group.thought.put", {
1065
1128
  "thought_id": "gt-...",
1066
1129
  "type": "e2ee.group_encrypted",
1067
1130
  "encrypted": true,
1068
- "payload": {"type": "e2ee.group_encrypted", "...": "..."},
1131
+ "payload": {"type": "e2ee.group_encrypted", "version": "v2", "...": "..."},
1069
1132
  "client_signature": { "...": "..." }
1070
1133
  }
1071
1134
  ```
@@ -1091,7 +1154,7 @@ await client.call("group.thought.put", {
1091
1154
 
1092
1155
  | 参数 | 类型 | 必填 | 说明 |
1093
1156
  |------|------|------|------|
1094
- | `group_id` | string | 是 | 群组 ID |
1157
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1095
1158
  | `sender_aid` | string | 是 | thought 作者 AID |
1096
1159
  | `context.type` | string | 是 | 思考的上下文类型,推荐 `run` |
1097
1160
  | `context.id` | string | 是 | 思考的上下文 ID,如 `run_id` |
@@ -1140,9 +1203,9 @@ result = await client.call("group.thought.get", {
1140
1203
 
1141
1204
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
1142
1205
  |------|------|------|--------|------|
1143
- | `group_id` | string | 是 | — | 群组 ID |
1206
+ | `group_id` | string | 是 | — | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1144
1207
  | `after_message_seq` | integer | 否 | 0 | 从该消息 seq 之后拉取 |
1145
- | `limit` | integer | 否 | 100 | 最大条数 |
1208
+ | `limit` | integer | 否 | 50 | 最大条数(最大 50;`pull_max_limit` 配置只能进一步收紧) |
1146
1209
  | `device_id` | string | 否 | — | 设备 ID(多设备模式) |
1147
1210
 
1148
1211
  **响应**:
@@ -1153,7 +1216,7 @@ result = await client.call("group.thought.get", {
1153
1216
  "messages": [ ... ],
1154
1217
  "latest_message_seq": 42,
1155
1218
  "has_more": false,
1156
- "limit": 100
1219
+ "limit": 50
1157
1220
  }
1158
1221
  ```
1159
1222
 
@@ -1169,7 +1232,7 @@ result = await client.call("group.thought.get", {
1169
1232
 
1170
1233
  | 参数 | 类型 | 必填 | 说明 |
1171
1234
  |------|------|------|------|
1172
- | `group_id` | string | 是 | 群组 ID |
1235
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1173
1236
  | `device_id` | string | 是 | 设备 ID |
1174
1237
  | `msg_seq` | integer | 是 | 确认到的消息序号 |
1175
1238
 
@@ -1194,7 +1257,7 @@ result = await client.call("group.thought.get", {
1194
1257
 
1195
1258
  | 参数 | 类型 | 必填 | 说明 |
1196
1259
  |------|------|------|------|
1197
- | `group_id` | string | 是 | 群组 ID |
1260
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1198
1261
  | `message_ids` | string[] | 是 | 待撤回消息 ID 列表,最多 100 个(`recall_max_batch`)|
1199
1262
  | `reason` | string | 否 | 可选撤回理由,建议短文本(最长 255 字符)|
1200
1263
 
@@ -1234,191 +1297,116 @@ result = await client.call("group.thought.get", {
1234
1297
 
1235
1298
  ---
1236
1299
 
1237
- ## 公告与规则
1300
+ ## 群文件系统
1238
1301
 
1239
- ### group.get_announcement
1302
+ 新代码统一使用 `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}`。
1240
1303
 
1241
- 获取群公告。
1304
+ 推荐通过 SDK/CLI 使用:
1242
1305
 
1243
- **参数**:`group_id` (string, 必填)
1306
+ | 语言 | 入口 |
1307
+ |------|------|
1308
+ | Python | `client.group.fs` |
1309
+ | TypeScript / JavaScript | `client.group.fs` |
1310
+ | Go | `client.Group().FS()` |
1311
+ | CLI | `aun group fs ...` |
1244
1312
 
1245
- **响应**:
1313
+ 权限与签名约束:
1246
1314
 
1247
- ```json
1248
- {
1249
- "group_id": "g-abc123.agentid.pub",
1250
- "announcement": { ... }
1251
- }
1252
- ```
1315
+ - 群自有区是除 `memberdata` 等系统保留路径外的整个 `group_aid` namespace。`group_aid` 当前证书签名可写;`role:owner` 默认可写;`role:admin` 需要 owner 通过 `group.fs.set_acl` 显式授权后才可写。
1316
+ - `group.fs.set_acl` / `group.fs.remove_acl` / `group.fs.get_acl` / `group.fs.list_acl` 只能由当前 group owner 调用,且当前只允许管理或查询 `grantee_aid="role:admin"` 的群自有区角色 ACL;成员升降级、退群、踢出不会联动授权或撤销。
1317
+ - `memberdata/{member_ref}` 写入默认只允许该成员本人;SDK 只传 group path,不拼接真实 storage 路径。
1318
+ - 上传控制面会透传 `parents` 到 storage:默认 `parents=true` 时可递归创建父目录,显式 `parents=false` 时父目录必须已存在。
1319
+ - JavaScript 浏览器版 `cp(string, group)` 默认把 string 当文本内容上传;Node 本地路径需显式传 `sourceType: "path"`、`localPath: true` 或使用 `local:` 前缀。Python、TypeScript 和 Go 默认把 string 当本地路径。
1253
1320
 
1254
- ### group.update_announcement
1321
+ ### group.fs.ls
1255
1322
 
1256
- 更新群公告。需要 **admin 及以上**权限。
1323
+ 列出目录。参数:`path` 必填;可选 `page`、`size`、`marker`、`long`、`recursive`。响应返回 group view `items`,节点 `path` 仍为 group path。
1257
1324
 
1258
- **参数**:
1325
+ ### group.fs.find
1259
1326
 
1260
- | 参数 | 类型 | 必填 | 说明 |
1261
- |------|------|------|------|
1262
- | `group_id` | string | 是 | 群组 ID |
1263
- | `content` | string | 是 | 公告内容(上限由 announcement_max_length 配置,默认 4000) |
1264
- | `attachments` | array | 否 | 存储引用数组 |
1327
+ 查找节点。参数:`path` 必填;可选 `pattern`、`name`、`type`、`size`、`mtime`、`page`、`page_size`。
1265
1328
 
1266
- **响应**:
1329
+ ### group.fs.stat
1267
1330
 
1268
- ```json
1269
- {
1270
- "group_id": "g-abc123.agentid.pub",
1271
- "announcement": { ... }
1272
- }
1273
- ```
1331
+ 查看节点。参数:`path` 必填。响应为 NodeView。
1274
1332
 
1275
- ### group.get_rules
1333
+ ### group.fs.lstat
1276
1334
 
1277
- 获取群规则。
1335
+ 查看链接节点本身。参数同 `group.fs.stat`。
1278
1336
 
1279
- **参数**:`group_id` (string, 必填)
1337
+ ### group.fs.df
1280
1338
 
1281
- **响应**:
1339
+ 查看群文件系统用量。参数可传 `path` 或 `group_id`。
1282
1340
 
1283
- ```json
1284
- {
1285
- "group_id": "g-abc123.agentid.pub",
1286
- "rules": { ... }
1287
- }
1288
- ```
1341
+ ### group.fs.create_download_ticket
1289
1342
 
1290
- ### group.update_rules
1343
+ 创建下载票据。参数:`path` 必填。响应包含 `download_url`、可选 `sha256`、`content_type`、`file_name`。SDK 下载数据面使用该票据执行 HTTP GET 并校验 sha256。
1291
1344
 
1292
- 更新群规则。需要 **admin 及以上**权限。
1345
+ ### group.fs.set_acl
1293
1346
 
1294
- **参数**:`group_id` (string) + 规则字段(max_members, allow_member_invite 等,均可选)
1347
+ 授予群自有区角色 ACL。需要当前 group owner 身份签名调用;底层由 group 服务以内部门面写入 `storage.set_acl`。
1295
1348
 
1296
- ### group.get_join_requirements
1349
+ 参数:`path` 必填,指向群自有区路径;`grantee_aid` 只能为 `role:admin`;`perms` 默认 `rwx`,必须包含写权限。`path` 可传 `group_aid:/archive` 等 group path。服务端写入 storage 内部权限位时会把 POSIX 删除位 `x` 映射为内部 `d`,对外响应仍显示 `rwx`。
1297
1350
 
1298
- 获取入群要求。
1351
+ ### group.fs.remove_acl
1299
1352
 
1300
- **参数**:`group_id` (string, 必填)
1353
+ 撤销群自有区角色 ACL。需要当前 group owner 身份签名调用;底层由 group 服务以内部门面写入 `storage.remove_acl`。
1301
1354
 
1302
- **响应**:
1355
+ 参数:`path` 必填,指向群自有区路径;`grantee_aid` 只能为 `role:admin`。撤销后,当前 admin 角色成员不再因该路径的 `role:admin` ACL 获得写权限。
1303
1356
 
1304
- ```json
1305
- {
1306
- "group_id": "g-abc123.agentid.pub",
1307
- "join_requirements": {
1308
- "group_id": "g-abc123.agentid.pub",
1309
- "mode": "approval",
1310
- "question": "请描述你的用途",
1311
- "auto_approve_patterns": [],
1312
- "max_pending": 100,
1313
- "updated_by": "alice.agentid.pub",
1314
- "updated_at": 1234567890
1315
- }
1316
- }
1317
- ```
1357
+ ### group.fs.get_acl
1318
1358
 
1319
- ### group.update_join_requirements
1359
+ 查询群自有区角色 ACL。需要当前 group owner 身份签名调用;普通 admin/member 不能查询。参数:`path` 必填,指向群自有区路径;可传裸路径 + `group_id`,也可传完整 `group_aid:/...`。
1320
1360
 
1321
- 更新入群要求。需要 **admin 及以上**权限。
1361
+ 响应包含 `group_id`、`group_aid`、`path`、`area`、`storage` 和 `acls`。`acls[].perms` 使用 POSIX 视图,删除权限显示为 `x`,因此 owner 授权 `role:admin:rwx` 后查询也返回 `rwx`。
1322
1362
 
1323
- **参数**:
1363
+ ### group.fs.list_acl
1324
1364
 
1325
- | 参数 | 类型 | 必填 | 说明 |
1326
- |------|------|------|------|
1327
- | `group_id` | string | 是 | 群组 ID |
1328
- | `mode` | string | 否 | `"open"` / `"approval"` / `"invite_only"` / `"closed"` |
1329
- | `question` | string | 否 | 入群问题 |
1330
- | `auto_approve_patterns` | array | 否 | 自动批准正则列表 |
1331
- | `max_pending` | integer | 否 | 最大待审批数 |
1365
+ `group.fs.get_acl` 的别名,参数、权限和返回结构完全相同。
1332
1366
 
1333
- ---
1334
-
1335
- ## 群文件系统
1336
-
1337
- 新代码统一使用 `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 不拼接 `groupdata/{group_id}`。
1338
-
1339
- 推荐通过 SDK/CLI 使用:
1340
-
1341
- | 语言 | 入口 |
1342
- |------|------|
1343
- | Python | `client.group.fs` |
1344
- | TypeScript / JavaScript | `client.group.fs` |
1345
- | Go | `client.Group().FS()` |
1346
- | CLI | `aun group fs ...` |
1347
-
1348
- 权限与签名约束:
1349
-
1350
- - 群自有区(如 `group_aid:/announce`、`/public`、`/archive`)只有 owner 可写,但实际调用身份必须是 `group_aid`,并且 `client_signature_aid` 必须是当前 group_identity。`group_aid` 私钥由群主持有;admin/member 不能用个人 AID 直接写群自有区。
1351
- - `memberdata/{member_ref}` 写入默认只允许该成员本人;SDK 只传 group path,不拼接真实 storage 路径。
1352
- - 上传控制面会透传 `parents` 到 storage:默认 `parents=true` 时可递归创建父目录,显式 `parents=false` 时父目录必须已存在。
1353
- - JavaScript 浏览器版 `cp(string, group)` 默认把 string 当文本内容上传;Node 本地路径需显式传 `sourceType: "path"`、`localPath: true` 或使用 `local:` 前缀。Python、TypeScript 和 Go 默认把 string 当本地路径。
1354
-
1355
- ### group.fs.ls
1356
-
1357
- 列出目录。参数:`path` 必填;可选 `page`、`size`、`marker`、`long`、`recursive`。响应返回 group view `items`,节点 `path` 仍为 group path。
1358
-
1359
- ### group.fs.find
1360
-
1361
- 查找节点。参数:`path` 必填;可选 `pattern`、`name`、`type`、`size`、`mtime`、`page`、`page_size`。
1362
-
1363
- ### group.fs.stat
1364
-
1365
- 查看节点。参数:`path` 必填。响应为 NodeView。
1366
-
1367
- ### group.fs.lstat
1368
-
1369
- 查看链接节点本身。参数同 `group.fs.stat`。
1370
-
1371
- ### group.fs.df
1372
-
1373
- 查看群文件系统用量。参数可传 `path` 或 `group_id`。
1374
-
1375
- ### group.fs.create_download_ticket
1376
-
1377
- 创建下载票据。参数:`path` 必填。响应包含 `download_url`、可选 `sha256`、`content_type`、`file_name`。SDK 下载数据面使用该票据执行 HTTP GET 并校验 sha256。
1378
-
1379
- ### group.fs.mkdir
1380
-
1381
- 创建目录。参数:`path` 必填;`parents` 可选,默认 `false`。
1382
-
1383
- ### group.fs.rm
1384
-
1385
- 删除节点。参数:`path` 必填;`recursive`、`force` 可选。
1386
-
1387
- ### group.fs.cp
1388
-
1389
- 只处理 group→group 远程复制。参数:`src`、`dst` 必填;`force`、`recursive`、`follow_symlinks` 可选。本地上传和下载由 SDK 的 `cp` 编排数据面,不直接调用此 RPC。
1390
-
1391
- ### group.fs.mv
1392
-
1393
- 只处理 group→group 远程移动。参数:`src`、`dst` 必填;`force` 可选。本地路径参与时 SDK/CLI 应拒绝。
1394
-
1395
- ### group.fs.check_upload
1396
-
1397
- 上传前检查。参数:`path`、`size_bytes`、`sha256`、`content_type`;可选 `force`、`parents`、`expected_version`、`metadata`。响应可包含 `target_exists`、`within_limit`、`instant`、`dedup_hit` 或 `skip_upload`。
1398
-
1399
- ### group.fs.create_upload_session
1400
-
1401
- 创建上传会话。参数同 `check_upload`。响应包含 `upload_url`、`session_id`、可选 `headers`。SDK 使用该 URL 执行 HTTP PUT。
1402
-
1403
- ### group.fs.complete_upload
1404
-
1405
- 完成上传。参数包含 `path`、`sha256`、`size_bytes`、可选 `session_id`、`skip_blob`、`metadata`、`expected_version`。响应为 group view NodeView。
1406
-
1407
- ### group.fs.mount
1408
-
1409
- 挂载成员数据区。参数:`path` 必填;可选 `readonly`、`require_approval`、`source_bucket`、`expires_at`、`volume_id`。
1410
-
1411
- ### group.fs.umount
1412
-
1413
- 卸载成员数据区。参数:`path` 必填。对成员数据区卸载不删除成员源数据。
1414
-
1415
- ## 在线状态
1416
-
1417
- ### group.get_online_members
1367
+ ### group.fs.mkdir
1368
+
1369
+ 创建目录。参数:`path` 必填;`parents` 可选,默认 `false`。
1370
+
1371
+ ### group.fs.rm
1372
+
1373
+ 删除节点。参数:`path` 必填;`recursive`、`force` 可选。
1374
+
1375
+ ### group.fs.cp
1376
+
1377
+ 只处理 group→group 远程复制。参数:`src`、`dst` 必填;`force`、`recursive`、`follow_symlinks` 可选。本地上传和下载由 SDK 的 `cp` 编排数据面,不直接调用此 RPC。
1378
+
1379
+ ### group.fs.mv
1380
+
1381
+ 只处理 group→group 远程移动。参数:`src`、`dst` 必填;`force` 可选。本地路径参与时 SDK/CLI 应拒绝。
1382
+
1383
+ ### group.fs.check_upload
1384
+
1385
+ 上传前检查。参数:`path`、`size_bytes`、`sha256`、`content_type`;可选 `force`、`parents`、`expected_version`、`metadata`。响应可包含 `target_exists`、`within_limit`、`instant`、`dedup_hit` `skip_upload`。
1386
+
1387
+ ### group.fs.create_upload_session
1388
+
1389
+ 创建上传会话。参数同 `check_upload`。响应包含 `upload_url`、`session_id`、可选 `headers`。SDK 使用该 URL 执行 HTTP PUT。
1390
+
1391
+ ### group.fs.complete_upload
1392
+
1393
+ 完成上传。参数包含 `path`、`sha256`、`size_bytes`、可选 `session_id`、`skip_blob`、`metadata`、`expected_version`。响应为 group view NodeView。
1394
+
1395
+ ### group.fs.mount
1396
+
1397
+ 挂载成员数据区。参数:`path` 必填;可选 `readonly`、`require_approval`、`source_bucket`、`expires_at`、`volume_id`。
1398
+
1399
+ ### group.fs.umount
1400
+
1401
+ 卸载成员数据区。参数:`path` 必填。对成员数据区卸载不删除成员源数据。
1402
+
1403
+ ## 在线状态
1404
+
1405
+ ### group.get_online_members
1418
1406
 
1419
1407
  获取当前在线成员列表。
1420
1408
 
1421
- **参数**:`group_id` (string, 必填)
1409
+ **参数**:`group_id`(string,必填;兼容字段,值使用目标态 `group_aid`)
1422
1410
 
1423
1411
  **响应**:
1424
1412
 
@@ -1433,10 +1421,10 @@ result = await client.call("group.thought.get", {
1433
1421
  {
1434
1422
  "aid": "alice.agentid.pub",
1435
1423
  "role": "owner",
1436
- "joined_at": 1234567890,
1424
+ "joined_at": 1234567890000,
1437
1425
  "online": true,
1438
1426
  "session_id": "sess_123",
1439
- "last_active_at": 1234567890,
1427
+ "last_active_at": 1234567890000,
1440
1428
  "expire_at": 1234571490
1441
1429
  }
1442
1430
  ]
@@ -1457,12 +1445,12 @@ result = await client.call("group.thought.get", {
1457
1445
 
1458
1446
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
1459
1447
  |------|------|------|--------|------|
1460
- | `group_id` | string | 是 | — | 群组 ID |
1448
+ | `group_id` | string | 是 | — | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1461
1449
  | `device_id` | string | 否 | — | 设备 ID,多设备模式必填 |
1462
1450
  | `device_name` | string | 否 | — | 设备名称(首次注册时使用) |
1463
1451
  | `device_type` | string | 否 | — | 设备类型 |
1464
1452
  | `after_event_seq` | integer | 否 | 游标位置 | 从该事件 seq 之后拉取;多设备模式下默认使用设备游标 |
1465
- | `limit` | integer | 否 | 100 | 最大条数(受 `pull_max_limit` 配置限制) |
1453
+ | `limit` | integer | 否 | 50 | 最大条数(最大 50;`pull_max_limit` 配置只能进一步收紧) |
1466
1454
 
1467
1455
  **响应**:
1468
1456
 
@@ -1472,7 +1460,7 @@ result = await client.call("group.thought.get", {
1472
1460
  "events": [ ... ],
1473
1461
  "latest_event_seq": 100,
1474
1462
  "has_more": false,
1475
- "limit": 100,
1463
+ "limit": 50,
1476
1464
  "cursor": {
1477
1465
  "current_seq": 50,
1478
1466
  "join_seq": 0,
@@ -1492,7 +1480,7 @@ result = await client.call("group.thought.get", {
1492
1480
 
1493
1481
  | 参数 | 类型 | 必填 | 说明 |
1494
1482
  |------|------|------|------|
1495
- | `group_id` | string | 是 | 群组 ID |
1483
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1496
1484
  | `device_id` | string | 是 | 设备 ID |
1497
1485
  | `msg_seq` | integer | 是 | 确认到的消息序号 |
1498
1486
 
@@ -1508,7 +1496,7 @@ result = await client.call("group.thought.get", {
1508
1496
 
1509
1497
  | 参数 | 类型 | 必填 | 说明 |
1510
1498
  |------|------|------|------|
1511
- | `group_id` | string | 是 | 群组 ID |
1499
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1512
1500
  | `device_id` | string | 是 | 设备 ID |
1513
1501
  | `event_seq` | integer | 是 | 确认到的事件序号 |
1514
1502
 
@@ -1518,7 +1506,7 @@ result = await client.call("group.thought.get", {
1518
1506
 
1519
1507
  列出当前用户在指定群组的所有设备及游标状态。
1520
1508
 
1521
- **参数**:`group_id` (必填)
1509
+ **参数**:`group_id`(必填;兼容字段,值使用目标态 `group_aid`)
1522
1510
 
1523
1511
  **响应**:
1524
1512
 
@@ -1541,7 +1529,7 @@ result = await client.call("group.thought.get", {
1541
1529
 
1542
1530
  注销设备游标(清理不再使用的设备记录)。
1543
1531
 
1544
- **参数**:`group_id` (必填), `device_id` (必填)
1532
+ **参数**:`group_id`(必填;兼容字段,值使用目标态 `group_aid`),`device_id` (必填)
1545
1533
 
1546
1534
  **响应**:`{ "success": true }`
1547
1535
 
@@ -1553,7 +1541,7 @@ result = await client.call("group.thought.get", {
1553
1541
 
1554
1542
  获取管理员列表(owner + admin 角色)。
1555
1543
 
1556
- **参数**:`group_id` (必填)
1544
+ **参数**:`group_id`(必填;兼容字段,值使用目标态 `group_aid`)
1557
1545
 
1558
1546
  **响应**:
1559
1547
 
@@ -1564,7 +1552,7 @@ result = await client.call("group.thought.get", {
1564
1552
  "aid": "alice.agentid.pub",
1565
1553
  "role": "owner",
1566
1554
  "member_type": "human",
1567
- "joined_at": 1234567890
1555
+ "joined_at": 1234567890000
1568
1556
  }
1569
1557
  ]
1570
1558
  }
@@ -1574,7 +1562,7 @@ result = await client.call("group.thought.get", {
1574
1562
 
1575
1563
  获取群主 AID。
1576
1564
 
1577
- **参数**:`group_id` (必填)
1565
+ **参数**:`group_id`(必填;兼容字段,值使用目标态 `group_aid`)
1578
1566
 
1579
1567
  **响应**:`{ "group_id": "g-abc123.agentid.pub", "owner_aid": "alice.agentid.pub" }`
1580
1568
 
@@ -1582,7 +1570,7 @@ result = await client.call("group.thought.get", {
1582
1570
 
1583
1571
  获取群组综合统计摘要。
1584
1572
 
1585
- **参数**:`group_id` (必填)
1573
+ **参数**:`group_id`(必填;兼容字段,值使用目标态 `group_aid`)
1586
1574
 
1587
1575
  **响应**:
1588
1576
 
@@ -1601,47 +1589,17 @@ result = await client.call("group.thought.get", {
1601
1589
  "message_seq": 1000,
1602
1590
  "event_seq": 2000,
1603
1591
  "e2ee_epoch": 3,
1604
- "created_at": 1234567890,
1605
- "updated_at": 1234567890
1592
+ "created_at": 1234567890000,
1593
+ "updated_at": 1234567890000
1606
1594
  }
1607
1595
  ```
1608
1596
 
1609
- ### group.get_metrics
1610
-
1611
- 获取群组性能指标,包含 E2EE epoch 范围记录。需要 **admin 及以上**权限。
1612
-
1613
- **参数**:`group_id` (必填)
1614
-
1615
- **响应**:
1616
-
1617
- ```json
1618
- {
1619
- "group_id": "g-abc123.agentid.pub",
1620
- "message_seq": 1000,
1621
- "event_seq": 2000,
1622
- "member_count": 10,
1623
- "online_count": 5,
1624
- "e2ee_epoch": 3,
1625
- "epoch_count": 4,
1626
- "epoch_ranges": [
1627
- {
1628
- "epoch": 0,
1629
- "start_msg_seq": 0,
1630
- "start_event_seq": 0,
1631
- "end_msg_seq": 100,
1632
- "end_event_seq": 200,
1633
- "rotated_by": "alice.agentid.pub",
1634
- "rotated_at": 1234567890
1635
- }
1636
- ]
1637
- }
1638
- ```
1639
1597
 
1640
1598
  ### group.refresh_member_types
1641
1599
 
1642
1600
  刷新成员类型分类统计。
1643
1601
 
1644
- **参数**:`group_id` (必填)
1602
+ **参数**:`group_id`(必填;兼容字段,值使用目标态 `group_aid`)
1645
1603
 
1646
1604
  **响应**:
1647
1605
 
@@ -1659,37 +1617,6 @@ result = await client.call("group.thought.get", {
1659
1617
 
1660
1618
  ---
1661
1619
 
1662
- ## E2EE
1663
-
1664
- ### group.e2ee.rotate_epoch
1665
-
1666
- CAS 轮换群组 E2EE Epoch。需要 **admin 及以上**权限。
1667
-
1668
- **参数**:
1669
-
1670
- | 参数 | 类型 | 必填 | 说明 |
1671
- |------|------|------|------|
1672
- | `group_id` | string | 是 | 群组 ID |
1673
- | `current_epoch` | integer | 是 | 当前 epoch 值(CAS 校验) |
1674
- | `rotation_signature` | string | 是 | 轮换签名(Base64,ECDSA SHA-256) |
1675
- | `rotation_timestamp` | string | 是 | 轮换时间戳(秒) |
1676
-
1677
- **响应**:`{ "group_id": "g-abc123.agentid.pub", "success": true, "epoch": 4 }`
1678
-
1679
- > 签名格式:`{group_id}|{current_epoch}|{new_epoch}|{aid}|{rotation_timestamp}`。时间戳必须在 5 分钟窗口内。签名去重防止重放攻击(10 分钟窗口)。
1680
-
1681
- ### group.e2ee.get_epoch
1682
-
1683
- 获取当前 E2EE Epoch 值。
1684
-
1685
- **参数**:`group_id` (必填)
1686
-
1687
- **响应**:`{ "group_id": "g-abc123.agentid.pub", "epoch": 3 }`
1688
-
1689
- ---
1690
-
1691
- ---
1692
-
1693
1620
  ## 事件
1694
1621
 
1695
1622
  ### event/group.created
@@ -1728,17 +1655,16 @@ CAS 轮换群组 E2EE Epoch。需要 **admin 及以上**权限。
1728
1655
  }
1729
1656
  ```
1730
1657
 
1731
- SDK 交付给应用层的群事件信封字段统一放在 `envelope`。0.4.x 兼容期仍保留顶层 `module_id` / `action` / `group_id` / `event_seq` 等别名,下一个大版本 0.5.* 将移除这些顶层别名,请通过 `ev["envelope"]["action"]` 等路径访问。
1658
+ SDK 交付给应用层的群事件信封字段统一放在 `envelope`。0.5.x 当前仍保留顶层 `module_id` / `action` / `group_id` / `event_seq` 等兼容别名;新代码应优先通过 `ev["envelope"]["action"]` 等路径访问。
1732
1659
 
1733
1660
  | 字段 | 类型 | 说明 |
1734
1661
  |------|------|------|
1735
1662
  | `envelope` | object | 群事件信封,包含 `module_id`、`action`、`group_id`、`event_seq`、`event_type`、`actor_aid`、`created_at`、`device_id`、`slot_id` 等存在的字段 |
1736
1663
  | `module_id` | string | 固定 `"group"` |
1737
1664
  | `action` | string | 变更类型(见下表) |
1738
- | `group_id` | string | 群组 ID |
1665
+ | `group_id` | string | 兼容字段,值语义为目标态 `group_aid` |
1739
1666
  | `event_seq` | integer | 可选,服务端分配的单调递增序号,用于 SDK 内部保序去重 |
1740
- | `request_id` | string | 可选,仅资源审批相关 action |
1741
- | `resource_path` | string | 可选,仅资源相关 action |
1667
+ | `path` | string | 可选,Group FS 相关 action 的节点路径 |
1742
1668
 
1743
1669
  **保序去重(SDK 内部行为)**:
1744
1670
 
@@ -1774,12 +1700,9 @@ SDK 交付给应用层的群事件信封字段统一放在 `envelope`。0.4.x
1774
1700
  | `invite_code_revoked` | 邀请码撤销 |
1775
1701
  | `member_banned` | 成员封禁 |
1776
1702
  | `member_unbanned` | 成员解封 |
1777
- | `resource_put` | 资源上传 |
1778
- | `resource_updated` | 资源更新 |
1779
- | `resource_deleted` | 资源删除 |
1780
- | `suspended` | 群组暂停 |
1781
- | `resumed` | 群组恢复 |
1782
- | `dissolved` | 群组解散 |
1703
+ | `suspended` | 群组暂停 |
1704
+ | `resumed` | 群组恢复 |
1705
+ | `dissolved` | 群组解散 |
1783
1706
 
1784
1707
  **订阅**:
1785
1708
 
@@ -1803,11 +1726,21 @@ client.on("group.changed", lambda ev: print(ev["action"]))
1803
1726
  "type": "e2ee.group_encrypted",
1804
1727
  "dispatch_mode": "broadcast",
1805
1728
  "payload": { "type": "e2ee.group_encrypted", "..." : "..." },
1806
- "dispatch": {"mode": "broadcast", "reason": "duty_disabled"},
1807
- "kind": "group.broadcast",
1808
- "member_aids": ["bob.agentid.pub"]
1809
- }
1810
- ```
1729
+ "dispatch": {"mode": "broadcast", "reason": "duty_disabled"},
1730
+ "kind": "group.broadcast",
1731
+ "member_aids": ["bob.agentid.pub"],
1732
+ "proximity": {
1733
+ "same_device": false,
1734
+ "same_egress_ip": true,
1735
+ "same_network": true,
1736
+ "basis": "egress_ip",
1737
+ "asserted_by": "gateway"
1738
+ },
1739
+ "same_device": false,
1740
+ "same_egress_ip": true,
1741
+ "same_network": true
1742
+ }
1743
+ ```
1811
1744
 
1812
1745
  SDK 收到后自动解密 `payload`,解密后的明文消息直接交付用户回调。
1813
1746
 
@@ -1848,7 +1781,7 @@ SDK 收到后自动调用 `group.pull` 拉取最新消息并逐条解密后交
1848
1781
  }
1849
1782
  ```
1850
1783
 
1851
- 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"]` 等路径访问。
1784
+ SDK 交付给应用层的 `payload` 是明文业务 JSON 对象;群消息信封字段统一放在 `envelope`。`envelope` 只保留可转发的归一化元数据,`from` 由 `sender_aid` 归一化而来,`timestamp` 由 `created_at` / `t_server` 归一化而来。0.5.x 当前仍保留顶层 `group_id` / `seq` / `message_id` / `sender_aid` / `dispatch_mode` 等兼容别名;新代码应优先通过 `msg["envelope"]["from"]`、`msg["envelope"]["timestamp"]` 等路径访问。Gateway 可能附加 `proximity` 及 `same_device` / `same_egress_ip` / `same_network`,表示由 Gateway 基于连接上下文判断的近端关系提示,不参与 E2EE AAD 或业务鉴权。
1852
1785
 
1853
1786
  ### event/group.message_recalled
1854
1787
 
@@ -1880,13 +1813,13 @@ SDK 交付给应用层的 `payload` 是明文业务 JSON 对象;群消息信
1880
1813
  }
1881
1814
  ```
1882
1815
 
1883
- 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.* 将移除这些顶层别名。
1816
+ SDK 交付给应用层的撤回事件同样带 `envelope`。`envelope` 表示当前交付的撤回 tombstone / 通知自身信封,不是被撤回原消息的信封;业务侧被撤回的原消息列表继续使用 `message_ids` / `target_message_seqs`。`message_id` / `seq` 继续只保留在顶层兼容字段中,不进入 `envelope`。0.5.x 当前仍保留顶层 `group_id` / `seq` / `message_id` / `sender_aid` 等兼容别名;新代码应优先读取 `envelope`、`message_ids` 和 `target_message_seqs`。
1884
1817
 
1885
1818
  | 字段 | 类型 | 说明 |
1886
1819
  |------|------|------|
1887
1820
  | `envelope` | object | 撤回 tombstone / 通知自身信封,包含 `group_id`、`from`、`type`、`kind`、`timestamp`、`encrypted`、`context`、`protected_headers` 等存在的字段 |
1888
1821
  | `module_id` | string | 固定 `"group"` |
1889
- | `group_id` | string | 群组 ID |
1822
+ | `group_id` | string | 兼容字段,值语义为目标态 `group_aid` |
1890
1823
  | `seq` | integer | 当前交付的撤回 tombstone / 通知 seq;在线 push 为 notice_seq,原 seq 占位 tombstone 为原消息 seq |
1891
1824
  | `message_id` | string | 当前交付的撤回 tombstone / 通知自己的 message_id |
1892
1825
  | `tombstone_message_id` | string | 兼容别名,等同于撤回 tombstone / 通知自身的 `message_id` |
@@ -1920,9 +1853,10 @@ Group 服务定义了以下专用错误码(-33xxx 段):
1920
1853
  | -33005 | Not a member | 需先加入群组 |
1921
1854
  | -33006 | Invite code invalid or expired | 获取新邀请码 |
1922
1855
  | -33007 | Join request pending | 等待审批,勿重复提交 |
1923
- | -33008 | Resource not found | 检查 resource_path |
1856
+ | -33008 | Group FS path not found | 检查 path |
1924
1857
  | -33009 | Resource request not found | 检查 request_id |
1925
1858
 
1926
1859
  > SDK 客户端将 -33001 映射为 `GroupNotFoundError`,-33002~-33003 映射为 `GroupStateError`,其余映射为 `GroupError`。未识别的错误码 fallback 到 `AUNError`。
1927
1860
 
1928
1861
 
1862
+