@agentunion/fastaun-browser 0.5.0 → 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 (116) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/_packed_docs/CHANGELOG-validators.md +144 -0
  3. package/_packed_docs/CHANGELOG.md +56 -0
  4. package/_packed_docs/INDEX.md +198 -181
  5. package/_packed_docs/KITE_DOCS_GUIDE.md +26 -23
  6. package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +4 -3
  7. package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +331 -0
  8. package/_packed_docs/protocol/08-AUN-E2EE-Group.md +296 -902
  9. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +64 -114
  10. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +7 -1
  11. 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
  12. package/_packed_docs/protocol/README.md +2 -1
  13. package/_packed_docs/protocol/index.md +8 -3
  14. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +4 -252
  15. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +483 -457
  16. package/_packed_docs/sdk/09-collab-rpc-manual.md +581 -550
  17. package/_packed_docs/sdk/09-group-rpc-manual.md +248 -335
  18. package/_packed_docs/sdk/09-storage-rpc-manual.md +56 -19
  19. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +13 -13
  20. package/_packed_docs/sdk/INDEX.md +14 -14
  21. package/dist/bundle.js +1560 -1159
  22. package/dist/client/delivery.d.ts +13 -2
  23. package/dist/client/delivery.d.ts.map +1 -1
  24. package/dist/client/delivery.js +251 -46
  25. package/dist/client/delivery.js.map +1 -1
  26. package/dist/client/group-state.d.ts.map +1 -1
  27. package/dist/client/group-state.js +36 -14
  28. package/dist/client/group-state.js.map +1 -1
  29. package/dist/client/lifecycle.js +2 -2
  30. package/dist/client/lifecycle.js.map +1 -1
  31. package/dist/client/rpc-pipeline.d.ts +1 -0
  32. package/dist/client/rpc-pipeline.d.ts.map +1 -1
  33. package/dist/client/rpc-pipeline.js +166 -50
  34. package/dist/client/rpc-pipeline.js.map +1 -1
  35. package/dist/client/v2-e2ee.d.ts +14 -1
  36. package/dist/client/v2-e2ee.d.ts.map +1 -1
  37. package/dist/client/v2-e2ee.js +300 -121
  38. package/dist/client/v2-e2ee.js.map +1 -1
  39. package/dist/client.d.ts +5 -4
  40. package/dist/client.d.ts.map +1 -1
  41. package/dist/client.js +187 -46
  42. package/dist/client.js.map +1 -1
  43. package/dist/collab/client.d.ts +8 -0
  44. package/dist/collab/client.d.ts.map +1 -1
  45. package/dist/collab/client.js +12 -0
  46. package/dist/collab/client.js.map +1 -1
  47. package/dist/errors.d.ts +0 -20
  48. package/dist/errors.d.ts.map +1 -1
  49. package/dist/errors.js +8 -51
  50. package/dist/errors.js.map +1 -1
  51. package/dist/facades.d.ts +9 -4
  52. package/dist/facades.d.ts.map +1 -1
  53. package/dist/facades.js +192 -31
  54. package/dist/facades.js.map +1 -1
  55. package/dist/group-fs.d.ts +17 -0
  56. package/dist/group-fs.d.ts.map +1 -1
  57. package/dist/group-fs.js +54 -11
  58. package/dist/group-fs.js.map +1 -1
  59. package/dist/group-id.d.ts +9 -12
  60. package/dist/group-id.d.ts.map +1 -1
  61. package/dist/group-id.js +41 -63
  62. package/dist/group-id.js.map +1 -1
  63. package/dist/index.d.ts +4 -2
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +4 -1
  66. package/dist/index.js.map +1 -1
  67. package/dist/keystore/index.d.ts +2 -54
  68. package/dist/keystore/index.d.ts.map +1 -1
  69. package/dist/keystore/indexeddb-identity-store.d.ts +3 -0
  70. package/dist/keystore/indexeddb-identity-store.d.ts.map +1 -1
  71. package/dist/keystore/indexeddb-identity-store.js +65 -0
  72. package/dist/keystore/indexeddb-identity-store.js.map +1 -1
  73. package/dist/keystore/indexeddb-shared.d.ts +3 -17
  74. package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
  75. package/dist/keystore/indexeddb-shared.js +4 -47
  76. package/dist/keystore/indexeddb-shared.js.map +1 -1
  77. package/dist/keystore/indexeddb-token-store.d.ts +1 -64
  78. package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
  79. package/dist/keystore/indexeddb-token-store.js +45 -774
  80. package/dist/keystore/indexeddb-token-store.js.map +1 -1
  81. package/dist/logger.d.ts +2 -0
  82. package/dist/logger.d.ts.map +1 -1
  83. package/dist/logger.js +4 -0
  84. package/dist/logger.js.map +1 -1
  85. package/dist/storage/lowlevel.d.ts +9 -1
  86. package/dist/storage/lowlevel.d.ts.map +1 -1
  87. package/dist/storage/lowlevel.js +12 -1
  88. package/dist/storage/lowlevel.js.map +1 -1
  89. package/dist/storage/vfs.d.ts +22 -0
  90. package/dist/storage/vfs.d.ts.map +1 -1
  91. package/dist/storage/vfs.js +54 -0
  92. package/dist/storage/vfs.js.map +1 -1
  93. package/dist/tools/cross-sdk-agent.js +336 -49
  94. package/dist/tools/cross-sdk-agent.js.map +1 -1
  95. package/dist/transport.d.ts +2 -0
  96. package/dist/transport.d.ts.map +1 -1
  97. package/dist/transport.js +96 -3
  98. package/dist/transport.js.map +1 -1
  99. package/dist/types.d.ts +39 -56
  100. package/dist/types.d.ts.map +1 -1
  101. package/dist/v2/session/session.d.ts +2 -0
  102. package/dist/v2/session/session.d.ts.map +1 -1
  103. package/dist/v2/session/session.js +58 -22
  104. package/dist/v2/session/session.js.map +1 -1
  105. package/dist/v2/state/commitment.d.ts +1 -1
  106. package/dist/v2/state/commitment.d.ts.map +1 -1
  107. package/dist/v2/state/commitment.js +5 -3
  108. package/dist/v2/state/commitment.js.map +1 -1
  109. package/dist/validators.d.ts +35 -0
  110. package/dist/validators.d.ts.map +1 -0
  111. package/dist/validators.js +127 -0
  112. package/dist/validators.js.map +1 -0
  113. package/dist/version.d.ts +1 -1
  114. package/dist/version.js +1 -1
  115. package/package.json +1 -1
  116. 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,49 +95,43 @@
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
 
@@ -146,13 +139,13 @@
146
139
 
147
140
  ## Group ID 规范
148
141
 
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,避免同一群的不同别名产生不同材料。
150
-
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` 参数说明。
152
-
153
- `group.create` 可以指定自定义 `group_id`,但不能是纯数字(纯数字群号保留给服务端自动分配),且规范化后的 canonical group_id 未被占用;如果已被占用或与旧别名碰撞会返回错误。不指定 `group_id` 时服务端按群号自动分配,并通过唯一约束兜底,发现碰撞会重新生成。
154
-
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`。
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,避免同一群的不同别名产生不同材料。
143
+
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` 参数说明。
145
+
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`。
156
149
 
157
150
  ---
158
151
 
@@ -237,27 +230,36 @@
237
230
  }
238
231
  ```
239
232
 
240
- ### group.get
233
+ ### group.get_info
241
234
 
242
- 查询群组信息。
235
+ 查询群组信息,返回平铺格式。默认返回公开字段;需要成员或管理员权限的字段必须通过 `required` 显式声明。
243
236
 
244
237
  **参数**:
245
238
 
246
239
  | 参数 | 类型 | 必填 | 说明 |
247
240
  |------|------|------|------|
248
241
  | `group_id` | string | 是 | 群组 ID |
242
+ | `required` | string[] | 否 | 受限字段声明:`member`、`state`、`e2ee`、`avatar` |
249
243
 
250
- **响应**:
244
+ **默认响应**:
251
245
 
252
246
  ```json
253
247
  {
254
248
  "found": true,
255
249
  "group_id": "g-abc123.agentid.pub",
256
- "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
257
257
  }
258
258
  ```
259
259
 
260
- > 若群组不存在,`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` 默认行为等价于原公开信息查询。
261
263
 
262
264
  ### group.update
263
265
 
@@ -334,21 +336,6 @@
334
336
 
335
337
  > **注意**:当前 `page` 固定为 1,不支持翻页。仅返回公开群组。
336
338
 
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
339
  ### group.suspend
353
340
 
354
341
  暂停群组。暂停期间不能发送消息。需要 **admin 及以上**权限。
@@ -398,29 +385,6 @@
398
385
  }
399
386
  ```
400
387
 
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
388
 
425
389
  ---
426
390
 
@@ -526,7 +490,7 @@
526
490
 
527
491
  ### group.set_role
528
492
 
529
- 设置成员角色。需要 **owner** 权限。不能改变 owner 角色。
493
+ 设置成员角色。需要 **owner** 权限。不能改变 owner 角色。该 RPC 只改变 membership 中的角色事实,不授予或撤销群自有区写 ACL;`role:admin` 是否可写群自有区由 `group.fs.set_acl` / `group.fs.remove_acl` 显式控制。
530
494
 
531
495
  **参数**:
532
496
 
@@ -540,7 +504,7 @@
540
504
 
541
505
  ```json
542
506
  {
543
- "group_id": "g-abc123.agentid.pub",
507
+ "group": { ... },
544
508
  "member": {
545
509
  "group_id": "g-abc123.agentid.pub",
546
510
  "aid": "bob.agentid.pub",
@@ -549,7 +513,11 @@
549
513
  "joined_at": 1234567890,
550
514
  "last_ack_seq": 0,
551
515
  "last_pull_at": 0
552
- }
516
+ },
517
+ "old_role": "member",
518
+ "new_role": "admin",
519
+ "acl_model": "role_based",
520
+ "acl_policy": "unchanged"
553
521
  }
554
522
  ```
555
523
 
@@ -574,6 +542,113 @@
574
542
  }
575
543
  ```
576
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
+
577
652
  ### group.ban
578
653
 
579
654
  封禁成员。被封禁者禁止发消息但保留成员身份,且不能重新加入(如先被移除再封禁)。需要 **admin 及以上**权限。
@@ -942,32 +1017,6 @@ await client.call("group.set_settings", {
942
1017
  }
943
1018
  ```
944
1019
 
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
1020
  ## 消息
972
1021
 
973
1022
  ### group.send
@@ -1234,187 +1283,112 @@ result = await client.call("group.thought.get", {
1234
1283
 
1235
1284
  ---
1236
1285
 
1237
- ## 公告与规则
1286
+ ## 群文件系统
1238
1287
 
1239
- ### group.get_announcement
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}`。
1240
1289
 
1241
- 获取群公告。
1290
+ 推荐通过 SDK/CLI 使用:
1242
1291
 
1243
- **参数**:`group_id` (string, 必填)
1292
+ | 语言 | 入口 |
1293
+ |------|------|
1294
+ | Python | `client.group.fs` |
1295
+ | TypeScript / JavaScript | `client.group.fs` |
1296
+ | Go | `client.Group().FS()` |
1297
+ | CLI | `aun group fs ...` |
1244
1298
 
1245
- **响应**:
1299
+ 权限与签名约束:
1246
1300
 
1247
- ```json
1248
- {
1249
- "group_id": "g-abc123.agentid.pub",
1250
- "announcement": { ... }
1251
- }
1252
- ```
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 当本地路径。
1253
1306
 
1254
- ### group.update_announcement
1307
+ ### group.fs.ls
1255
1308
 
1256
- 更新群公告。需要 **admin 及以上**权限。
1309
+ 列出目录。参数:`path` 必填;可选 `page`、`size`、`marker`、`long`、`recursive`。响应返回 group view `items`,节点 `path` 仍为 group path。
1257
1310
 
1258
- **参数**:
1311
+ ### group.fs.find
1259
1312
 
1260
- | 参数 | 类型 | 必填 | 说明 |
1261
- |------|------|------|------|
1262
- | `group_id` | string | 是 | 群组 ID |
1263
- | `content` | string | 是 | 公告内容(上限由 announcement_max_length 配置,默认 4000) |
1264
- | `attachments` | array | 否 | 存储引用数组 |
1313
+ 查找节点。参数:`path` 必填;可选 `pattern`、`name`、`type`、`size`、`mtime`、`page`、`page_size`。
1265
1314
 
1266
- **响应**:
1315
+ ### group.fs.stat
1267
1316
 
1268
- ```json
1269
- {
1270
- "group_id": "g-abc123.agentid.pub",
1271
- "announcement": { ... }
1272
- }
1273
- ```
1317
+ 查看节点。参数:`path` 必填。响应为 NodeView。
1274
1318
 
1275
- ### group.get_rules
1319
+ ### group.fs.lstat
1276
1320
 
1277
- 获取群规则。
1321
+ 查看链接节点本身。参数同 `group.fs.stat`。
1278
1322
 
1279
- **参数**:`group_id` (string, 必填)
1323
+ ### group.fs.df
1280
1324
 
1281
- **响应**:
1325
+ 查看群文件系统用量。参数可传 `path` 或 `group_id`。
1282
1326
 
1283
- ```json
1284
- {
1285
- "group_id": "g-abc123.agentid.pub",
1286
- "rules": { ... }
1287
- }
1288
- ```
1327
+ ### group.fs.create_download_ticket
1289
1328
 
1290
- ### group.update_rules
1329
+ 创建下载票据。参数:`path` 必填。响应包含 `download_url`、可选 `sha256`、`content_type`、`file_name`。SDK 下载数据面使用该票据执行 HTTP GET 并校验 sha256。
1291
1330
 
1292
- 更新群规则。需要 **admin 及以上**权限。
1331
+ ### group.fs.set_acl
1293
1332
 
1294
- **参数**:`group_id` (string) + 规则字段(max_members, allow_member_invite 等,均可选)
1333
+ 授予群自有区角色 ACL。需要当前 group owner 身份签名调用;底层由 group 服务以内部门面写入 `storage.set_acl`。
1295
1334
 
1296
- ### group.get_join_requirements
1335
+ 参数:`path` 必填,指向群自有区路径;`grantee_aid` 只能为 `role:admin`;`perms` 默认 `rwx`,必须包含写权限。`path` 可传 `group_aid:/archive` 等 group path。服务端写入 storage 内部权限位时会把 POSIX 删除位 `x` 映射为内部 `d`,对外响应仍显示 `rwx`。
1297
1336
 
1298
- 获取入群要求。
1337
+ ### group.fs.remove_acl
1299
1338
 
1300
- **参数**:`group_id` (string, 必填)
1339
+ 撤销群自有区角色 ACL。需要当前 group owner 身份签名调用;底层由 group 服务以内部门面写入 `storage.remove_acl`。
1301
1340
 
1302
- **响应**:
1341
+ 参数:`path` 必填,指向群自有区路径;`grantee_aid` 只能为 `role:admin`。撤销后,当前 admin 角色成员不再因该路径的 `role:admin` ACL 获得写权限。
1303
1342
 
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
- ```
1343
+ ### group.fs.get_acl
1318
1344
 
1319
- ### group.update_join_requirements
1345
+ 查询群自有区角色 ACL。需要当前 group owner 身份签名调用;普通 admin/member 不能查询。参数:`path` 必填,指向群自有区路径;可传裸路径 + `group_id`,也可传完整 `group_aid:/...`。
1320
1346
 
1321
- 更新入群要求。需要 **admin 及以上**权限。
1347
+ 响应包含 `group_id`、`group_aid`、`path`、`area`、`storage` 和 `acls`。`acls[].perms` 使用 POSIX 视图,删除权限显示为 `x`,因此 owner 授权 `role:admin:rwx` 后查询也返回 `rwx`。
1322
1348
 
1323
- **参数**:
1349
+ ### group.fs.list_acl
1324
1350
 
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 | 否 | 最大待审批数 |
1332
-
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
1351
+ `group.fs.get_acl` 的别名,参数、权限和返回结构完全相同。
1352
+
1353
+ ### group.fs.mkdir
1354
+
1355
+ 创建目录。参数:`path` 必填;`parents` 可选,默认 `false`。
1356
+
1357
+ ### group.fs.rm
1358
+
1359
+ 删除节点。参数:`path` 必填;`recursive`、`force` 可选。
1360
+
1361
+ ### group.fs.cp
1362
+
1363
+ 只处理 groupgroup 远程复制。参数:`src`、`dst` 必填;`force`、`recursive`、`follow_symlinks` 可选。本地上传和下载由 SDK `cp` 编排数据面,不直接调用此 RPC。
1364
+
1365
+ ### group.fs.mv
1366
+
1367
+ 只处理 group→group 远程移动。参数:`src`、`dst` 必填;`force` 可选。本地路径参与时 SDK/CLI 应拒绝。
1368
+
1369
+ ### group.fs.check_upload
1370
+
1371
+ 上传前检查。参数:`path`、`size_bytes`、`sha256`、`content_type`;可选 `force`、`parents`、`expected_version`、`metadata`。响应可包含 `target_exists`、`within_limit`、`instant`、`dedup_hit` 或 `skip_upload`。
1372
+
1373
+ ### group.fs.create_upload_session
1374
+
1375
+ 创建上传会话。参数同 `check_upload`。响应包含 `upload_url`、`session_id`、可选 `headers`。SDK 使用该 URL 执行 HTTP PUT。
1376
+
1377
+ ### group.fs.complete_upload
1378
+
1379
+ 完成上传。参数包含 `path`、`sha256`、`size_bytes`、可选 `session_id`、`skip_blob`、`metadata`、`expected_version`。响应为 group view NodeView。
1380
+
1381
+ ### group.fs.mount
1382
+
1383
+ 挂载成员数据区。参数:`path` 必填;可选 `readonly`、`require_approval`、`source_bucket`、`expires_at`、`volume_id`。
1384
+
1385
+ ### group.fs.umount
1386
+
1387
+ 卸载成员数据区。参数:`path` 必填。对成员数据区卸载不删除成员源数据。
1388
+
1389
+ ## 在线状态
1390
+
1391
+ ### group.get_online_members
1418
1392
 
1419
1393
  获取当前在线成员列表。
1420
1394
 
@@ -1606,36 +1580,6 @@ result = await client.call("group.thought.get", {
1606
1580
  }
1607
1581
  ```
1608
1582
 
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
1583
 
1640
1584
  ### group.refresh_member_types
1641
1585
 
@@ -1659,37 +1603,6 @@ result = await client.call("group.thought.get", {
1659
1603
 
1660
1604
  ---
1661
1605
 
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
1606
  ## 事件
1694
1607
 
1695
1608
  ### event/group.created
@@ -1737,8 +1650,7 @@ SDK 交付给应用层的群事件信封字段统一放在 `envelope`。0.4.x
1737
1650
  | `action` | string | 变更类型(见下表) |
1738
1651
  | `group_id` | string | 群组 ID |
1739
1652
  | `event_seq` | integer | 可选,服务端分配的单调递增序号,用于 SDK 内部保序去重 |
1740
- | `request_id` | string | 可选,仅资源审批相关 action |
1741
- | `resource_path` | string | 可选,仅资源相关 action |
1653
+ | `path` | string | 可选,Group FS 相关 action 的节点路径 |
1742
1654
 
1743
1655
  **保序去重(SDK 内部行为)**:
1744
1656
 
@@ -1920,9 +1832,10 @@ Group 服务定义了以下专用错误码(-33xxx 段):
1920
1832
  | -33005 | Not a member | 需先加入群组 |
1921
1833
  | -33006 | Invite code invalid or expired | 获取新邀请码 |
1922
1834
  | -33007 | Join request pending | 等待审批,勿重复提交 |
1923
- | -33008 | Resource not found | 检查 resource_path |
1835
+ | -33008 | Group FS path not found | 检查 path |
1924
1836
  | -33009 | Resource request not found | 检查 request_id |
1925
1837
 
1926
1838
  > SDK 客户端将 -33001 映射为 `GroupNotFoundError`,-33002~-33003 映射为 `GroupStateError`,其余映射为 `GroupError`。未识别的错误码 fallback 到 `AUNError`。
1927
1839
 
1928
1840
 
1841
+