@agentunion/fastaun-browser 0.5.1 → 0.5.3

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 (88) hide show
  1. package/CHANGELOG.md +570 -504
  2. package/_packed_docs/CHANGELOG-validators.md +134 -131
  3. package/_packed_docs/CHANGELOG.md +570 -504
  4. package/_packed_docs/INDEX.md +65 -52
  5. package/_packed_docs/KITE_DOCS_GUIDE.md +23 -18
  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 -261
  9. package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +328 -328
  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 +293 -294
  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 +183 -60
  19. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +4 -4
  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 -177
  22. package/_packed_docs/protocol/README.md +7 -6
  23. package/_packed_docs/protocol/aun-docs-guide.md +5 -4
  24. package/_packed_docs/protocol/index.md +9 -8
  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/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +20 -1
  30. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +26 -18
  31. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +33 -34
  32. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +274 -4
  33. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +41 -13
  34. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +28 -12
  35. package/_packed_docs/sdk/09-group-rpc-manual.md +237 -142
  36. package/_packed_docs/sdk/09-message-rpc-manual.md +50 -28
  37. package/_packed_docs/sdk/09-payload-reference.md +3 -3
  38. package/_packed_docs/sdk/09-storage-rpc-manual.md +1 -1
  39. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +12 -9
  40. 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
  41. package/_packed_docs/sdk/INDEX.md +29 -28
  42. package/_packed_docs/sdk/Notify/351/200/232/347/237/245/346/226/271/346/241/210.md +6 -2
  43. package/dist/agent-md.d.ts.map +1 -1
  44. package/dist/agent-md.js +18 -9
  45. package/dist/agent-md.js.map +1 -1
  46. package/dist/bundle.js +1084 -272
  47. package/dist/client/delivery.d.ts +4 -0
  48. package/dist/client/delivery.d.ts.map +1 -1
  49. package/dist/client/delivery.js +174 -7
  50. package/dist/client/delivery.js.map +1 -1
  51. package/dist/client/v2-e2ee.d.ts.map +1 -1
  52. package/dist/client/v2-e2ee.js +79 -8
  53. package/dist/client/v2-e2ee.js.map +1 -1
  54. package/dist/client.d.ts +27 -1
  55. package/dist/client.d.ts.map +1 -1
  56. package/dist/client.js +118 -12
  57. package/dist/client.js.map +1 -1
  58. package/dist/facades.d.ts +6 -0
  59. package/dist/facades.d.ts.map +1 -1
  60. package/dist/facades.js +213 -33
  61. package/dist/facades.js.map +1 -1
  62. package/dist/group-index.d.ts +105 -0
  63. package/dist/group-index.d.ts.map +1 -0
  64. package/dist/group-index.js +252 -0
  65. package/dist/group-index.js.map +1 -0
  66. package/dist/index.d.ts +1 -0
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +1 -0
  69. package/dist/index.js.map +1 -1
  70. package/dist/keystore/index.d.ts +15 -0
  71. package/dist/keystore/index.d.ts.map +1 -1
  72. package/dist/keystore/indexeddb-shared.d.ts +7 -1
  73. package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
  74. package/dist/keystore/indexeddb-shared.js +63 -2
  75. package/dist/keystore/indexeddb-shared.js.map +1 -1
  76. package/dist/keystore/indexeddb-token-store.d.ts +3 -1
  77. package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
  78. package/dist/keystore/indexeddb-token-store.js +22 -1
  79. package/dist/keystore/indexeddb-token-store.js.map +1 -1
  80. package/dist/tools/cross-sdk-agent.js +3 -1
  81. package/dist/tools/cross-sdk-agent.js.map +1 -1
  82. package/dist/transport.d.ts +2 -1
  83. package/dist/transport.d.ts.map +1 -1
  84. package/dist/transport.js +17 -31
  85. package/dist/transport.js.map +1 -1
  86. package/dist/version.d.ts +1 -1
  87. package/dist/version.js +1 -1
  88. package/package.json +1 -1
@@ -1,10 +1,12 @@
1
- # AUN-E2EE 扩展规范
2
-
3
- > 版本:2.0-draft
4
- > 状态:规范性文档
5
- > 适用范围:AUN 客户端 SDK、客户端应用、跨语言实现
6
- > 不适用范围:Gateway、Message 模块的加解密实现
7
- > 定位:**独立安全层**,横跨 `gateway`、`peer`、`relay` 三种连接模式
1
+ # AUN-E2EE 历史扩展规范(Legacy)
2
+
3
+ > 版本:2.0-draft
4
+ > 状态:历史兼容文档
5
+ > 适用范围:AUN 客户端 SDK、客户端应用、跨语言实现
6
+ > 不适用范围:Gateway、Message 模块的加解密实现
7
+ > 定位:旧 P2P E2EE 信封说明;当前默认主路径已迁移到 E2EE V2 多设备 wrap
8
+
9
+ > **当前实现说明**:最近版本的 SDK 默认使用 V2 多设备 wrap。P2P 加密消息通过 `message.send` 承载 `e2ee.p2p_encrypted` envelope,Group 加密消息通过 `group.v2.send` 承载 `e2ee.group_encrypted` envelope;每条消息一把 `master_key`,按 recipient 设备生成 `3DH` / `1DH` wrap,接收端验证 `sender_signature`、AAD、recipient digest/proof 后解密。当前 V2 链路见 [E2EE_V2消息通信时序图](../sdk/E2EE_V2消息通信时序图.md);群组 V2 规范见 [08-AUN-E2EE-Group](08-AUN-E2EE-Group.md)。本文保留 `prekey_ecdh_v2` / `long_term_key` 旧格式,用于历史兼容和迁移排查,不应作为新实现的默认发送格式。
8
10
 
9
11
  ---
10
12
 
@@ -108,7 +110,7 @@ AUN-E2EE 是 Layer 3 扩展协议,建立在以下核心能力之上:
108
110
 
109
111
  ### 5.2 密文消息
110
112
 
111
- 通过 `message.send` 传输的加密业务消息,`encrypted` 必须为 `true`,`payload.type` 必须为 `e2ee.encrypted`。
113
+ `e2ee.encrypted` 信封通过 `message.send` 传输时,`encrypted` 必须为 `true`,`payload.type` 必须为 `e2ee.encrypted`。当前新实现应使用 V2 `e2ee.p2p_encrypted` 信封。
112
114
 
113
115
  ---
114
116
 
@@ -186,7 +188,7 @@ AUN-E2EE 支持两种加密模式,SDK 自动按优先级选择。
186
188
 
187
189
  ### 7.3 模式选择策略
188
190
 
189
- SDK **MUST** 按以下优先级自动选择:
191
+ 旧版 SDK legacy 信封中按以下优先级自动选择:
190
192
 
191
193
  1. **优先**:prekey_ecdh_v2(服务端有接收方 prekey)
192
194
  2. **降级**:long_term_key(无 prekey 时,需客户端安全策略允许)
@@ -195,7 +197,7 @@ SDK **MUST** 按以下优先级自动选择:
195
197
 
196
198
  ### 7.4 兼容性
197
199
 
198
- - 发送端 **MUST** 使用 `prekey_ecdh_v2` 模式发送
200
+ - 旧版发送端应优先使用 `prekey_ecdh_v2` 模式发送;当前新实现应使用 V2 多设备 wrap。
199
201
 
200
202
  ---
201
203
 
@@ -28,47 +28,48 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
28
28
 
29
29
  | 字段 | 类型 | 说明 |
30
30
  |------|------|------|
31
- | `group_id` | string | 群组唯一 ID(自动生成或自定义) |
31
+ | `group_aid` | string | 群组主标识,目标态格式为 `{base}.{issuer-domain}` |
32
+ | `group_id` | string | 兼容字段;新群通常等于 `group_aid`,旧群可能保留历史值 |
32
33
  | `name` | string | 群组名称 |
33
34
  | `owner_aid` | string | 群主 AID |
34
35
  | `creator_aid` | string | 创建者 AID |
35
36
  | `visibility` | string | `"public"` / `"private"` |
36
- | `status` | string | `"active"` / `"suspended"` / `"closed"` |
37
+ | `status` | string | `"active"` / `"suspended"` / `"dissolved"` |
37
38
  | `description` | string | 群组描述 |
38
39
  | `metadata` | object | 自定义元数据 |
39
- | `dispatch_mode` | string | 群分发模式:`"broadcast"`(默认)/ `"mention"`,详见 [10.2.x 群分发模式](#1023-群分发模式dispatch_mode) |
40
+ | `dispatch_mode` | string | 群分发模式:`"broadcast"`(默认)/ `"mention"`,详见 [10.2.3 群分发模式](#1023-群分发模式dispatch_mode) |
40
41
  | `member_count` | integer | 成员数量 |
41
42
  | `message_seq` | integer | 最新消息序号 |
42
43
  | `event_seq` | integer | 最新事件序号 |
43
- | `created_at` | integer | 创建时间(Unix 秒) |
44
+ | `created_at` | integer | 创建时间(Unix 毫秒) |
44
45
 
45
- ### Group ID 格式与规范化
46
+ ### Group AID / Group ID 兼容规范
46
47
 
47
- `group_id` 是群组的全网唯一标识,前缀 `g-` 为 Group 保留前缀(legacy 格式)。普通 AID 的本地名称不得以 `g-` 开头,避免与群 ID 混淆。
48
+ 当前实现的群组主标识是 `group_aid`,格式为 `{base}.{issuer-domain}`,例如 `10042.agentid.pub`、`team01.agentid.pub`、`g-abc123.agentid.pub`。`group_id` 字段名和参数名继续保留,用于兼容旧 SDK / 旧数据库行;新建群以 `group_aid` 为准,新群的 `group_id` 通常也写入同一个 `group_aid` 值。前缀 `g-` 为 Group 保留前缀(legacy base 格式),普通 AID 的本地名称不得以 `g-` 开头,避免与群标识混淆。
48
49
 
49
50
  **支持的 base 格式**(不含域名部分):
50
51
  - **Legacy 格式**: `g-[a-z0-9]{4,32}` — 以 `g-` 开头,后接 4 到 32 位小写字母或数字
51
52
  - **新格式**: `[a-z0-9]{5,}` — 5 位或更多小写字母或数字,无上限
52
53
  - **Group name 格式**: `[a-z0-9][a-z0-9_-]{3,63}` — 4 到 64 个字符,可包含下划线和短横线
53
54
 
54
- 服务端必须接受以下输入形式,并在内部统一为 canonical group_id:
55
+ 服务端必须接受以下输入形式,并在 API 边界统一为目标态 `group_aid`:
55
56
 
56
- | 输入形式 | 用途 | canonical 结果 |
57
+ | 输入形式 | 用途 | 规范化结果 |
57
58
  |----------|------|----------------|
58
- | `{base}` | 本地域内简写(base 为上述任一格式) | 若本域 issuer 为 `issuer-domain`,规范化为 `group.issuer-domain/{base}` |
59
- | `{base}@issuer-domain` | 跨域传播兼容形式 | 规范化为 `group.issuer-domain/{base}` |
60
- | `{base}.issuer-domain` | canonical 形式 | 规范化为 `group.issuer-domain/{base}` |
61
- | `group.issuer-domain/{base}` | canonical 形式 | 保持为 `group.issuer-domain/{base}` |
59
+ | `{base}` | 本地域内简写(base 为上述任一格式) | 若本域 issuer 为 `issuer-domain`,规范化为 `{base}.issuer-domain` |
60
+ | `{base}@issuer-domain` | 旧跨域兼容形式 | 规范化为 `{base}.issuer-domain` |
61
+ | `{base}.issuer-domain` | 目标态形式 | 保持为 `{base}.issuer-domain` |
62
+ | `group.issuer-domain/{base}` | URL 风格兼容形式 | 规范化为 `{base}.issuer-domain` |
62
63
 
63
64
  规范化规则:
64
65
 
65
- - `group_id` 比较、数据库存储、成员归属、权限校验、E2EE AAD / 签名输入均必须使用 canonical group_id(`group.{issuer}/{base}` 格式)。
66
- - 输入必须先 trim 并转换为小写;`@issuer-domain` 和 `.issuer-domain` 形式仅作为兼容输入,进入内部前必须转换为 `group.{issuer}/{base}`。
67
- - 本域内客户端可以提交 `{base}` 简写;服务端按本域 `AUN_ISSUER_DOMAIN` 解析为 canonical group_id。没有本域 issuer 配置时,简写保持为 `{base}`。
68
- - 跨域消息、邀请传播、日志和协议响应应使用 canonical group_id,避免远端误把短 ID 当成本域群。
69
- - `group.create` 可以指定 `group_id`;指定时必须满足上述格式且未被占用,被占用时返回错误。未指定时由服务端自动分配。
70
- - 自动生成的群 ID 使用随机小写十六进制短字符串(长度 14),服务端必须通过唯一约束或等效机制保证 canonical group_id 唯一;发现碰撞时重新生成。
71
- - 在 `group.{issuer-domain}` 这类已携带 issuer 的公开 HTTP 主机下,生成的群链接 path 应使用本域简写,例如 `https://group.issuer-domain/{base}` `https://group.issuer-domain/{base}/invite/ic-xxx`。
66
+ - `group_aid` 比较、成员归属、权限校验、E2EE AAD / 签名输入应使用目标态 `{base}.{issuer-domain}`。
67
+ - 输入必须先 trim 并转换为小写;`group.{issuer}/{base}`、`{base}@issuer` 等形式仅作为兼容输入,进入主流程前必须转换为目标态 `group_aid`。
68
+ - 本域内客户端可以提交 `{base}` 简写;服务端按本域 `AUN_ISSUER_DOMAIN` 解析为 `{base}.{issuer-domain}`。没有本域 issuer 配置时,简写保持为 `{base}`。
69
+ - 跨域消息、邀请传播、日志和协议响应应优先使用 `group_aid`,避免远端误把短 ID 当成本域群。
70
+ - `group.create` 可以指定 `group_aid`;`group_id` 仍作为兼容别名。指定时必须满足上述格式且未被占用,被占用时返回错误。未指定时由服务端自动分配数字 base。
71
+ - 自动生成的群标识使用单调群号 base(例如 `10042`)并按本域 issuer 生成 `{group_no}.{issuer-domain}`;服务端通过唯一约束或等效机制保证 `group_aid` 唯一,发现碰撞时重新生成。
72
+ - 在 `https://group.{issuer-domain}/...` 这类已携带 issuer 的公开 HTTP 主机下,当前生成的群链接 path 使用单段 `group_aid`,例如 `https://group.agentid.pub/10042.agentid.pub/invite/ic-xxx`。历史 `{base}` 简写链接可继续由服务端兼容解析。
72
73
 
73
74
  ### 10.2.3 群分发模式(dispatch_mode)
74
75
 
@@ -104,16 +105,16 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
104
105
  | 字段 | 类型 | 说明 |
105
106
  |------|------|------|
106
107
  | `aid` | string | 成员 AID |
107
- | `group_id` | string | 群组 ID |
108
+ | `group_id` | string | 群组标识兼容字段,值语义为 `group_aid` |
108
109
  | `role` | string | `"owner"` / `"admin"` / `"member"` |
109
- | `joined_at` | integer | 加入时间(Unix 秒) |
110
+ | `joined_at` | integer | 加入时间(Unix 毫秒) |
110
111
  | `last_ack_seq` | integer | 最后已读消息序号 |
111
112
 
112
113
  ### Message 对象
113
114
 
114
115
  | 字段 | 类型 | 说明 |
115
116
  |------|------|------|
116
- | `group_id` | string | 群组 ID |
117
+ | `group_id` | string | 群组标识兼容字段,值语义为 `group_aid` |
117
118
  | `seq` | integer | 消息序号(群内单调递增) |
118
119
  | `message_id` | string | 消息 UUID |
119
120
  | `sender_aid` | string | 发送者 AID |
@@ -153,7 +154,8 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
153
154
  | 参数 | 类型 | 必填 | 说明 |
154
155
  |------|------|:----:|------|
155
156
  | `name` | string | ✅ | 群组名称 |
156
- | `group_id` | string | ❌ | 自定义群 ID,支持 legacy 格式 `g-[a-z0-9]{4,32}` 或新格式 `[a-z0-9]{5,}` 或 group name 格式 `[a-z0-9][a-z0-9_-]{3,63}`;不提供则服务端自动生成;已被占用时返回错误 |
157
+ | `group_aid` | string | ❌ | 自定义群主标识,目标态为 `{base}.{issuer-domain}`;不提供则服务端自动生成 |
158
+ | `group_id` | string | ❌ | 兼容别名,值语义同 `group_aid`;支持 legacy base `g-[a-z0-9]{4,32}`、新 base `[a-z0-9]{5,64}` 或 group name `[a-z0-9][a-z0-9_-]{3,63}` |
157
159
  | `visibility` | string | ❌ | `"public"` / `"private"`,默认由服务配置决定 |
158
160
  | `description` | string | ❌ | 群组描述 |
159
161
  | `metadata` | object | ❌ | 自定义元数据 |
@@ -168,6 +170,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
168
170
  {
169
171
  "group": {
170
172
  "group_id": "g-abc123.agentid.pub",
173
+ "group_aid": "g-abc123.agentid.pub",
171
174
  "name": "测试群",
172
175
  "owner_aid": "alice.agentid.pub",
173
176
  "creator_aid": "alice.agentid.pub",
@@ -176,26 +179,26 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
176
179
  "member_count": 1,
177
180
  "message_seq": 0,
178
181
  "event_seq": 0,
179
- "created_at": 1234567890
182
+ "created_at": 1234567890000
180
183
  },
181
184
  "aid": "alice.agentid.pub"
182
185
  }
183
186
  ```
184
187
 
185
- ### `group.get_info`
186
-
187
- 查询群组信息。默认返回公开平铺字段;需要成员信息、状态或 E2EE 字段时,通过 `required` 声明所需字段并由服务端鉴权。
188
-
189
- **参数**:
190
-
191
- | 参数 | 类型 | 必填 | 说明 |
192
- |------|------|:----:|------|
193
- | `group_id` | string | ✅ | 群组 ID 或 group AID |
194
- | `required` | string[] | ❌ | 可选值:`member` / `state` / `e2ee` / `avatar` |
195
-
196
- **响应**:平铺对象。默认字段包含 `found`、`group_id`、`group_aid`、`name`、`visibility`、`status`、`description`、`member_count`、`created_at`。
197
-
198
- > `group.get` 和 `group.info` 已合并到 `group.get_info`;`group.get_info` 默认行为等价于原公开信息查询。
188
+ ### `group.get_info`
189
+
190
+ 查询群组信息。默认返回公开平铺字段;需要成员信息、状态或 E2EE 字段时,通过 `required` 声明所需字段并由服务端鉴权。
191
+
192
+ **参数**:
193
+
194
+ | 参数 | 类型 | 必填 | 说明 |
195
+ |------|------|:----:|------|
196
+ | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
197
+ | `required` | string[] | ❌ | 可选值:`member` / `state` / `e2ee` / `avatar` |
198
+
199
+ **响应**:平铺对象。默认字段包含 `found`、`group_id`、`group_aid`、`name`、`visibility`、`status`、`description`、`member_count`、`created_at`。
200
+
201
+ > `group.get` 和 `group.info` 已合并到 `group.get_info`;`group.get_info` 默认行为等价于原公开信息查询。
199
202
 
200
203
  ### `group.update`
201
204
 
@@ -222,7 +225,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
222
225
  **响应**:`{ "query": "...", "items": [ ... ], "total": 3 }`
223
226
 
224
227
 
225
- ### `group.suspend`
228
+ ### `group.suspend`
226
229
 
227
230
  暂停群组,暂停期间不能发送消息。需要 admin 及以上权限。
228
231
 
@@ -258,7 +261,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
258
261
 
259
262
  | 参数 | 类型 | 必填 | 说明 |
260
263
  |------|------|:----:|------|
261
- | `group_id` | string | ✅ | 群组 ID |
264
+ | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
262
265
  | `aid` | string | ✅ | 要添加的 AID |
263
266
  | `role` | string | ❌ | `"member"` / `"admin"`,默认 `"member"` |
264
267
  | `member_type` | string | ❌ | `"human"` / `"ai"`,默认 `"human"` |
@@ -305,7 +308,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
305
308
 
306
309
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
307
310
  |------|------|:----:|--------|------|
308
- | `group_id` | string | ✅ | — | 群组 ID |
311
+ | `group_id` | string | ✅ | — | 群组标识兼容字段,值语义为 `group_aid` |
309
312
  | `page` | integer | ❌ | 1 | 页码 |
310
313
  | `size` | integer | ❌ | 50 | 每页条数 |
311
314
  | `role` | string | ❌ | — | 按角色过滤 |
@@ -348,14 +351,14 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
348
351
 
349
352
  | 参数 | 类型 | 必填 | 说明 |
350
353
  |------|------|:----:|------|
351
- | `group_id` | string | ✅ | 群组 ID |
354
+ | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
352
355
  | `type` | string | ❌ | 信封/封装类型,普通业务消息无需填写;SDK 加密群消息时自动使用 `e2ee.group_encrypted` |
353
356
  | `payload` | object | ✅ | 消息内容 |
354
357
  | `attachments` | array | ❌ | 存储引用列表 |
355
358
 
356
359
  ##### Payload 参考约定
357
360
 
358
- `group.send.params.payload` 的统一业务负载格式见 [消息Payload参考约定](../sdk/消息Payload参考约定.md)。完整群消息请求仍在 `payload` 同级传入 `group_id`;业务类型放在 `payload.type`,不要与 `group.send.params.type` 信封/封装类型混用。
361
+ `group.send.params.payload` 的统一业务负载格式见 [消息Payload参考约定](../sdk/消息Payload参考约定.md)。完整群消息请求仍在 `payload` 同级传入 `group_id`(兼容参数名,值使用目标态 `group_aid`);业务类型放在 `payload.type`,不要与 `group.send.params.type` 信封/封装类型混用。
359
362
 
360
363
  协议层只要求 `payload` 是 JSON 对象,并按服务端配置做大小、信封/封装类型和 E2EE epoch 相关检查;字段语义由应用层约定,接收端应对未知 `payload.type`、未知 `kind` 和缺失展示字段做降级处理。
361
364
 
@@ -396,9 +399,9 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
396
399
 
397
400
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
398
401
  |------|------|:----:|--------|------|
399
- | `group_id` | string | ✅ | — | 群组 ID |
402
+ | `group_id` | string | ✅ | — | 群组标识兼容字段,值语义为 `group_aid` |
400
403
  | `after_message_seq` | integer | ❌ | 0 | 拉取该 seq 之后的消息 |
401
- | `limit` | integer | ❌ | 100 | 最大条数 |
404
+ | `limit` | integer | ❌ | 50 | 最大条数(最大 50;`pull_max_limit` 配置只能进一步收紧) |
402
405
  | `device_id` | string | ❌ | — | 设备 ID(多设备模式) |
403
406
 
404
407
  **响应**:
@@ -409,7 +412,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
409
412
  "messages": [ ... ],
410
413
  "latest_message_seq": 42,
411
414
  "has_more": false,
412
- "limit": 100
415
+ "limit": 50
413
416
  }
414
417
  ```
415
418
 
@@ -443,7 +446,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
443
446
 
444
447
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
445
448
  |------|------|:----:|--------|------|
446
- | `group_id` | string | ✅ | — | 群组 ID |
449
+ | `group_id` | string | ✅ | — | 群组标识兼容字段,值语义为 `group_aid` |
447
450
  | `status` | string | ❌ | `"pending"` | `"pending"` / `"approved"` / `"rejected"` |
448
451
  | `page` | integer | ❌ | 1 | 页码 |
449
452
  | `size` | integer | ❌ | 50 | 每页条数 |
@@ -458,7 +461,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
458
461
 
459
462
  | 参数 | 类型 | 必填 | 说明 |
460
463
  |------|------|:----:|------|
461
- | `group_id` | string | ✅ | 群组 ID |
464
+ | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
462
465
  | `aid` | string | ✅ | 申请人 AID |
463
466
  | `approve` | boolean | ❌ | 批准(true)或拒绝(false),默认 true |
464
467
  | `reason` | string | ❌ | 拒绝原因 |
@@ -481,7 +484,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
481
484
 
482
485
  | 参数 | 类型 | 必填 | 说明 |
483
486
  |------|------|:----:|------|
484
- | `group_id` | string | ✅ | 群组 ID |
487
+ | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
485
488
  | `code` | string | ❌ | 自定义邀请码,不提供则自动生成 |
486
489
  | `max_uses` | integer | ❌ | 最大使用次数,默认 1,必须 > 0 |
487
490
  | `expires_in_seconds` | integer | ❌ | 有效期(秒),默认由配置决定(7 天) |
@@ -564,7 +567,130 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
564
567
 
565
568
  ---
566
569
 
567
- ## 10.13 事件
570
+ ## 10.13 群设置与 `group.index`
571
+
572
+ `group.set_settings` / `group.get_settings` 是群公告、群规则、入群要求、分发模式等群级设置的统一 RPC。`group.index` 是保留设置 key,用于保存 owner/admin SDK 生成并签名的群索引 JSONL。
573
+
574
+ ### Indexed Settings
575
+
576
+ 以下设置属于 indexed settings,修改时必须同包提交新的签名 `group.index`:
577
+
578
+ | key | 说明 |
579
+ |-----|------|
580
+ | `rules.content` | 群规则正文 |
581
+ | `rules.attachments` | 群规则附件稳定引用 |
582
+ | `announcement.content` | 群公告正文 |
583
+ | `announcement.attachments` | 群公告附件稳定引用 |
584
+ | `join.mode` | 入群模式 |
585
+ | `join.question` | 入群问题 |
586
+ | `join.auto_approve_patterns` | 自动批准规则 |
587
+ | `join.max_pending` | 最大待审批数量 |
588
+
589
+ `dispatch_mode`、`name`、`description`、`visibility` 等设置不属于 indexed settings,可继续通过普通 `group.set_settings` 写入,不要求 `group.index`。
590
+
591
+ ### `group.index` 正文
592
+
593
+ `group.index` 的值是对象,当前至少包含 `body` 字段。`body` 是 canonical JSONL:
594
+
595
+ ```jsonl
596
+ {"type":"index_meta","group_aid":"g-abc123.agentid.pub","etag":"\"sha256:...\"","last_modified":1780000000000,"schema":"aun.group.index.v1","body_hash":"sha256:...","signed_by":"alice.agentid.pub","sig_alg":"ECDSA-P256-SHA256","signature":"base64..."}
597
+ {"key":"rules.content","source":"db","etag":"\"sha256:...\"","last_modified":1780000000000}
598
+ ```
599
+
600
+ 规则:
601
+
602
+ - 第一行必须是 `type=index_meta`。
603
+ - `schema` 当前为 `aun.group.index.v1`。
604
+ - `etag` 是正文条目的 canonical JSONL bytes 的 SHA-256,格式为 `"sha256:<hex>"`(meta 行与 entries 行的 etag 字段均采用此格式)。
605
+ - `body_hash` 是同一正文条目 bytes 的 SHA-256,格式为 `sha256:<hex>`(不带引号)。
606
+ - `signed_by` 必须等于本次 RPC actor AID。
607
+ - `signature` 覆盖去掉 `signature` 字段后的 `index_meta` 和正文条目的 canonical JSONL bytes。
608
+ - canonical JSONL 使用 AUN V2 canonical JSON 规则:对象 key 按 Unicode code point 排序,非 ASCII 直出,数字不用科学计数法,整数值 float 输出为整数 token,NaN/Infinity 和超过安全整数范围的数字必须拒绝。
609
+ - 当前 P-256 身份使用 `sig_alg=ECDSA-P256-SHA256`;服务端校验实现已支持 Ed25519(`sig_alg=Ed25519`)和 RSA(`sig_alg=RSA-PKCS1v15-SHA256`)签名算法,**但当前版本四个语言 SDK 的 `verifyGroupIndex` / `buildSignedGroupIndex` 仅支持 ECDSA-P256-SHA256**。使用 Ed25519 或 RSA 算法签名的 `group.index` 无法被 SDK 侧验证,建议统一使用 P-256 身份。
610
+
611
+ Group 服务不根据 DB 状态生成 `group.index` 正文,只校验、CAS 保存和返回 owner/admin SDK 提交的签名正文。
612
+
613
+ ### `group.set_settings`
614
+
615
+ 需要 admin 及以上权限。
616
+
617
+ | 参数 | 类型 | 必填 | 说明 |
618
+ |------|------|:----:|------|
619
+ | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
620
+ | `settings` | object | ✅ | 要写入的设置键值 |
621
+ | `expected_index_etag` | string | 写 `group.index` 时必填 | CAS 期望旧 etag;空字符串表示只允许创建首个 `group.index` |
622
+
623
+ 写入约束:
624
+
625
+ - 只更新非 indexed settings 时,不需要 `group.index` 和 `expected_index_etag`。
626
+ - 更新任意 indexed setting 时,`settings` 必须同时包含 `group.index`。
627
+ - 写入 `group.index` 时必须传 `expected_index_etag`。
628
+ - 服务端在同一事务内比较当前 `group.index` etag、写 indexed settings、写 `group.index`;同请求内混入的普通 settings 和可事务化群元数据也一起提交或回滚。
629
+ - CAS 失败返回错误,错误消息包含 `group.index etag conflict`;SDK 应重新 `getGroupIndex`,合并本地修改并重新签名后再提交。
630
+
631
+ 响应示例:
632
+
633
+ ```json
634
+ {
635
+ "group_id": "g-abc123.agentid.pub",
636
+ "group_aid": "g-abc123.agentid.pub",
637
+ "updated_keys": ["announcement.content", "group.index"],
638
+ "_meta": {
639
+ "group_indexes": {
640
+ "g-abc123.agentid.pub": {
641
+ "etag": "\"sha256:...\"",
642
+ "last_modified": 1780000000000,
643
+ "schema": "aun.group.index.v1"
644
+ }
645
+ }
646
+ }
647
+ }
648
+ ```
649
+
650
+ ### `group.get_settings`
651
+
652
+ 成员可读。`keys=["group.index"]` 用于从服务端摘取当前签名 `group.index`。
653
+
654
+ | 参数 | 类型 | 必填 | 说明 |
655
+ |------|------|:----:|------|
656
+ | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
657
+ | `keys` | string[] | ❌ | 只读取指定 key;读取 `group.index` 时服务端强制返回对应 `_meta.group_indexes` |
658
+
659
+ 响应示例:
660
+
661
+ ```json
662
+ {
663
+ "group_id": "g-abc123.agentid.pub",
664
+ "group_aid": "g-abc123.agentid.pub",
665
+ "settings": [
666
+ {"key": "group.index", "value": {"body": "..."}, "updated_by": "alice.agentid.pub", "updated_at": 1780000000000}
667
+ ],
668
+ "_meta": {
669
+ "group_indexes": {
670
+ "g-abc123.agentid.pub": {
671
+ "etag": "\"sha256:...\"",
672
+ "last_modified": 1780000000000,
673
+ "schema": "aun.group.index.v1"
674
+ }
675
+ }
676
+ }
677
+ }
678
+ ```
679
+
680
+ ### `_meta.group_indexes`
681
+
682
+ `_meta.group_indexes` 是版本提示,不是 index 正文:
683
+
684
+ - key 是 canonical `group_aid`。
685
+ - value 当前包含 `etag`、`last_modified`、`schema`。
686
+ - Group 服务负责注入;Gateway/Message 最多透传或合并 `_meta`,不得计算、生成或改写 group index。
687
+ - 普通 settings 读取会按 actor/device/slot + group + etag 做注入频率控制;显式读取 `group.index` 和写入成功时强制注入。
688
+ - SDK 观察到新 `etag` 只记录远端版本提示;etag 不一致只表示本地与远端不同步,不表示远端一定应覆盖本地。
689
+ - 是否调用 `getGroupIndex` pull 远端,或调用 `updateGroupIndex` push 本地修改,由应用层决定。
690
+
691
+ ---
692
+
693
+ ## 10.14 事件
568
694
 
569
695
  Group 服务通过 `event/group.*` 事件推送变更通知给相关 AID。
570
696
 
@@ -617,13 +743,6 @@ Group 服务通过 `event/group.*` 事件推送变更通知给相关 AID。
617
743
  | `suspended` | 群组暂停 |
618
744
  | `resumed` | 群组恢复 |
619
745
  | `dissolved` | 群组解散 |
620
- | `resource_put` | 资源添加/更新 |
621
- | `resource_updated` | 资源元数据更新 |
622
- | `resource_deleted` | 资源删除 |
623
- | `resource_request_created` | 资源申请创建 |
624
- | `resource_direct_added` | 资源直接添加(owner) |
625
- | `resource_request_approved` | 资源申请批准 |
626
- | `resource_request_rejected` | 资源申请拒绝 |
627
746
 
628
747
  ### `event/group.message_created`
629
748
 
@@ -665,7 +784,7 @@ Group 服务通过 `event/group.*` 事件推送变更通知给相关 AID。
665
784
 
666
785
  ---
667
786
 
668
- ## 10.12 错误码
787
+ ## 10.15 错误码
669
788
 
670
789
  | 错误码 | 说明 | 客户端处理 |
671
790
  |--------|------|-----------|
@@ -673,7 +792,7 @@ Group 服务通过 `event/group.*` 事件推送变更通知给相关 AID。
673
792
  | -32602 | Invalid params(如缺少 group_id) | 检查参数 |
674
793
  | -32004 | Permission denied(权限不足) | 提示用户,不重试 |
675
794
  | -32001 | Authentication failed | 重新认证 |
676
- | -33001 | Group not found | 检查 group_id |
795
+ | -33001 | Group not found | 检查规范化后的 `group_aid`(`group_id` 为兼容参数名) |
677
796
  | -33002 | Group state invalid(群状态不允许该操作) | 检查群状态 |
678
797
  | -33003 | Group suspended | 等待恢复或联系管理员 |
679
798
  | -33004 | Group member limit reached | 不重试 |
@@ -683,11 +802,15 @@ Group 服务通过 `event/group.*` 事件推送变更通知给相关 AID。
683
802
  | -33008 | Invite code invalid or expired | 获取新邀请码 |
684
803
  | -33009 | Join rejected | 不重试 |
685
804
 
805
+ `group.index etag conflict` 表示 `expected_index_etag` 与服务端当前 `group.index` etag 不一致。客户端应先重新读取 `group.index`,在最新 index 上合并本地修改并重新签名后再提交。
806
+
686
807
  ---
687
808
 
688
- ## 10.13 设计约束与实现说明
809
+ ## 10.16 设计约束与实现说明
689
810
 
690
811
  - **Group Service 是独立 AID 持有者**:所有 `group.*` 方法都通过 Group Service 的 AID 暴露,不内嵌于 Gateway。
812
+ - **group.index 由 SDK 生成**:Group 服务只校验、CAS 保存和注入 meta,不根据 DB 状态拼装 `group.index`。
813
+ - **Gateway/Message 不承载 group.index 业务语义**:只能转发或合并 `_meta`,不能生成或改写 `_meta.group_indexes`。
691
814
  - **消息 seq 单调递增**:per-group 粒度,确保顺序一致性,`ack_seq` 仅增不减。
692
815
  - **事件 seq 独立计数**:`event_seq` 与 `message_seq` 独立;消息增量拉取使用 `group.pull`,事件增量拉取使用 `group.pull_events`。
693
816
  - **duty 模式**:`duty_mode` 非 `"none"` 且 `duty_human_message_policy = "dispatch"` 时,消息先推送给当班成员处理,回复后再广播;`group.pull` 始终可拉取全量消息。
@@ -247,7 +247,7 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
247
247
 
248
248
  ### 11.5.4 ACL / token / 可见性
249
249
 
250
- 统一权限求值顺序(硬顺序,不可调换):① 公开位(`set_visibility`/`is_public`,仅读)→ ② token(`issue_token` 签发,scope 到路径)→ ③ 路径前缀 ACL(`set_acl`,最近祖先匹配,权限位 `r`/`w`/`rw`/`rwx`)→ ④ 角色(群内)→ ⑤ owner → ⑥ 拒绝 `EACCES`。方法:`storage.set_acl` / `remove_acl` / `list_acl` / `set_visibility` / `check_access`(非抛错探测)/ `issue_token` / `revoke_token` / `list_tokens`。
250
+ 统一权限求值顺序(硬顺序,不可调换):① 公开位(`set_visibility`/`is_public`,仅读)→ ② token(`issue_token` 签发,scope 到路径)→ ③ 路径前缀 ACL(`set_acl`,最近祖先匹配,权限位 `r`/`w`/`rw`/`rwx`)→ ④ 角色(群内)→ ⑤ owner → ⑥ 拒绝 `EACCES`。方法:`storage.set_acl` / `remove_acl` / `list_acl` / `set_visibility` / `check_access`(非抛错探测)/ `issue_token` / `revoke_token` / `list_tokens`。
251
251
 
252
252
  AID storage 的 ACL 面向具体 AID,主要用于写/删除授权;撤销写授权使用 `storage.remove_acl`。读权限不通过 AID ACL 直接下发,应用应使用 `storage.create_share_link` / `storage.get_by_share` 间接读取,撤销读分享使用 `storage.revoke_share_link`。`role:*` 伪主体只允许可信 group 内部门面管理;普通客户端不得直接对 `group_aid` 空间设置或删除角色 ACL,群自有区 `role:admin` 写授权统一由 `group.fs.set_acl/remove_acl` 管理。
253
253
 
@@ -259,9 +259,9 @@ AID storage 的 ACL 面向具体 AID,主要用于写/删除授权;撤销写
259
259
 
260
260
  Storage 通过 CA 的 `aid_type` 字段(`normal`/`group`)识别群命名空间。命中 `aid_type=group` 且挂载路径落在 `/memberdata/` 时,放宽 owner 校验,改为调 `group.check_membership` RPC 实时校验成员身份 + 路径约束(mount_path 第一级 == requester_aid)。详见 `10-Group-子协议.md` 与 `docs/aun-fs/topics/group-space.md`。
261
261
 
262
- 成员个人 Storage 内的 `group_data` 是系统级真实存储根,Storage 服务端必须对普通 `storage.*` / `storage.fs.*` 请求隐藏并拒绝直接写入、删除、重命名或挂载;`aun fs` / Storage VFS 只呈现服务端返回结果,不新增保护逻辑。`group_data` 只能由可信 `group.fs.*` 内部上下文间接访问,占用的空间仍必须计入真实 owner AID 的 Storage 配额。完整规则见 [16-系统目录保护方案.md](16-系统目录保护方案.md)。
263
-
264
- POSIX VFS 写侧包含 `storage.fs.touch`:它可创建 0 字节文件或刷新已有文件、目录、软链的修改时间,支持 `parents`、`no_create`、`mtime` 和 `follow_symlinks`。这是普通 AID storage 的 VFS 能力;群自有区仍应通过 `group.fs.*` 面进入。
262
+ 成员个人 Storage 内的 `group_data` 是系统级真实存储根,Storage 服务端必须对普通 `storage.*` / `storage.fs.*` 请求隐藏并拒绝直接写入、删除、重命名或挂载;`aun fs` / Storage VFS 只呈现服务端返回结果,不新增保护逻辑。`group_data` 只能由可信 `group.fs.*` 内部上下文间接访问,占用的空间仍必须计入真实 owner AID 的 Storage 配额。完整规则见 [16-系统目录保护方案.md](16-系统目录保护方案.md)。
263
+
264
+ POSIX VFS 写侧包含 `storage.fs.touch`:它可创建 0 字节文件或刷新已有文件、目录、软链的修改时间,支持 `parents`、`no_create`、`mtime` 和 `follow_symlinks`。这是普通 AID storage 的 VFS 能力;群自有区仍应通过 `group.fs.*` 面进入。
265
265
 
266
266
  ### 11.5.7 collab 协作编排
267
267
 
@@ -290,7 +290,7 @@ Gateway 向 push_notify_aid 下发的事件通知:
290
290
  "unread_count": 3,
291
291
  "senders": ["alice.example.com", "charlie.example.com"],
292
292
  "latest_ts": 1716100005,
293
- "group_ids": ["group-uuid-1"]
293
+ "group_ids": ["g-abc123.agentid.pub"]
294
294
  }
295
295
  }
296
296
  ]