@agentunion/fastaun-browser 0.5.2 → 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 (57) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/_packed_docs/CHANGELOG.md +36 -0
  3. package/_packed_docs/INDEX.md +16 -10
  4. package/_packed_docs/KITE_DOCS_GUIDE.md +4 -2
  5. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +202 -75
  6. package/_packed_docs/protocol/README.md +3 -2
  7. package/_packed_docs/protocol/aun-docs-guide.md +3 -2
  8. package/_packed_docs/protocol/index.md +6 -5
  9. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +20 -1
  10. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +289 -24
  11. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +30 -6
  12. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +28 -12
  13. package/_packed_docs/sdk/09-group-rpc-manual.md +102 -28
  14. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +6 -4
  15. package/_packed_docs/sdk/INDEX.md +17 -17
  16. package/dist/bundle.js +982 -250
  17. package/dist/client/delivery.d.ts +4 -0
  18. package/dist/client/delivery.d.ts.map +1 -1
  19. package/dist/client/delivery.js +174 -7
  20. package/dist/client/delivery.js.map +1 -1
  21. package/dist/client/v2-e2ee.js +2 -2
  22. package/dist/client/v2-e2ee.js.map +1 -1
  23. package/dist/client.d.ts +27 -1
  24. package/dist/client.d.ts.map +1 -1
  25. package/dist/client.js +118 -12
  26. package/dist/client.js.map +1 -1
  27. package/dist/facades.d.ts +6 -0
  28. package/dist/facades.d.ts.map +1 -1
  29. package/dist/facades.js +213 -33
  30. package/dist/facades.js.map +1 -1
  31. package/dist/group-index.d.ts +105 -0
  32. package/dist/group-index.d.ts.map +1 -0
  33. package/dist/group-index.js +252 -0
  34. package/dist/group-index.js.map +1 -0
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/keystore/index.d.ts +15 -0
  40. package/dist/keystore/index.d.ts.map +1 -1
  41. package/dist/keystore/indexeddb-shared.d.ts +7 -1
  42. package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
  43. package/dist/keystore/indexeddb-shared.js +63 -2
  44. package/dist/keystore/indexeddb-shared.js.map +1 -1
  45. package/dist/keystore/indexeddb-token-store.d.ts +3 -1
  46. package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
  47. package/dist/keystore/indexeddb-token-store.js +22 -1
  48. package/dist/keystore/indexeddb-token-store.js.map +1 -1
  49. package/dist/tools/cross-sdk-agent.js +3 -1
  50. package/dist/tools/cross-sdk-agent.js.map +1 -1
  51. package/dist/transport.d.ts +2 -1
  52. package/dist/transport.d.ts.map +1 -1
  53. package/dist/transport.js +17 -31
  54. package/dist/transport.js.map +1 -1
  55. package/dist/version.d.ts +1 -1
  56. package/dist/version.js +1 -1
  57. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,42 @@
6
6
 
7
7
  ---
8
8
 
9
+ ## 0.5.3 — 2026-07-07
10
+
11
+ ### 新功能
12
+
13
+ #### group.index 索引化群设置
14
+ - 新增浏览器 `group.index` JSONL 工具:支持 canonical entries、body hash、etag、ECDSA P-256 签名/验签,以及将 settings 更新合并为带 `group.index` 的原子写入。
15
+ - `GroupFacade` 新增 `checkGroupIndex` / `getGroupIndex` / `updateGroupIndex`,写入时携带 `expected_index_etag` 做 CAS,并在冲突后重拉索引重试。
16
+ - 浏览器 IndexedDB TokenStore 新增 `group_index_cache`,按 local AID + group AID 持久化 index JSONL、remote meta、本地 etag、settings cache 和 entry etags。
17
+ - 入口导出 `GROUP_INDEX_KEY`、`GROUP_INDEX_SCHEMA`、`GroupIndexMetaCache`、`buildSignedGroupIndex`、`verifyGroupIndex`、`prepareGroupSettingsWithIndex` 等 group.index API。
18
+
19
+ ### 修复
20
+
21
+ #### 撤回去重与有序投递
22
+ - `message.recalled` 改为专用处理路径,支持 P2P 撤回 tombstone 的有序投递、自动 ack、gap fill 和按原消息标识去重,避免 push / pull 对同一次撤回重复回调。
23
+ - 群撤回去重键改为规范化 group id + 原消息 id/seq,忽略 `recalled_at`,并补齐顶层 recall 字段归一化。
24
+ - 群消息 pull / legacy fallback 识别 `group.message_recalled` tombstone,避免把撤回通知作为普通群消息投递。
25
+ - P2P 与群 push 按 namespace 串行化处理,降低异步解密和投递导致的乱序风险。
26
+ - V2 P2P / Group pull 页内消息按 `seq` 排序后处理,避免服务端返回无序时影响本地 seq 推进。
27
+
28
+ ### 改进
29
+
30
+ - `RPCTransport` 的 `_meta` observer 支持异步回调;RPC 成功响应会等待 observer 完成,事件/通知路径统一走安全的 meta observer 分发。
31
+ - `getAnnouncement` / `getRules` / `getJoinRequirements` 优先使用 group.index settings cache;`updateAnnouncement` / `updateRules` / `updateJoinRequirements` 改走 `updateGroupIndex`,保持索引与设置同步。
32
+ - cross-sdk JS agent 支持 `sdk.update_group_index` 调用,便于跨 SDK 测试索引化群设置。
33
+ - SDK 包版本、运行时 `VERSION` 和 conformance 期望版本更新为 `0.5.3`。
34
+
35
+ ### 测试
36
+
37
+ - 新增 group.index 单元测试,覆盖 hash/etag、签名/验签、settings merge、RPC meta stale/fresh、async meta observer 和 IndexedDB 持久化恢复。
38
+ - 新增 GroupFacade group.index 单元测试,覆盖 CAS 写入、冲突重试、远端索引验签、tamper 拒绝、settings cache 和便利方法索引化写入。
39
+ - 新增浏览器 E2E:验证签名 `group.index` 写入、裸 settings 写入拒绝、CAS 冲突重试和最终 settings 一致性。
40
+ - 扩展撤回投递测试,覆盖 P2P/group recall 顶层字段归一化、push/pull tombstone 去重和有序投递。
41
+ - 更新 group settings 与签名审计 E2E,使公告/群规等索引化 settings 通过 `updateGroupIndex` 写入。
42
+
43
+ ---
44
+
9
45
  ## 0.5.2 — 2026-07-05
10
46
 
11
47
  ### 新功能
@@ -6,6 +6,42 @@
6
6
 
7
7
  ---
8
8
 
9
+ ## 0.5.3 — 2026-07-07
10
+
11
+ ### 新功能
12
+
13
+ #### group.index 索引化群设置
14
+ - 新增浏览器 `group.index` JSONL 工具:支持 canonical entries、body hash、etag、ECDSA P-256 签名/验签,以及将 settings 更新合并为带 `group.index` 的原子写入。
15
+ - `GroupFacade` 新增 `checkGroupIndex` / `getGroupIndex` / `updateGroupIndex`,写入时携带 `expected_index_etag` 做 CAS,并在冲突后重拉索引重试。
16
+ - 浏览器 IndexedDB TokenStore 新增 `group_index_cache`,按 local AID + group AID 持久化 index JSONL、remote meta、本地 etag、settings cache 和 entry etags。
17
+ - 入口导出 `GROUP_INDEX_KEY`、`GROUP_INDEX_SCHEMA`、`GroupIndexMetaCache`、`buildSignedGroupIndex`、`verifyGroupIndex`、`prepareGroupSettingsWithIndex` 等 group.index API。
18
+
19
+ ### 修复
20
+
21
+ #### 撤回去重与有序投递
22
+ - `message.recalled` 改为专用处理路径,支持 P2P 撤回 tombstone 的有序投递、自动 ack、gap fill 和按原消息标识去重,避免 push / pull 对同一次撤回重复回调。
23
+ - 群撤回去重键改为规范化 group id + 原消息 id/seq,忽略 `recalled_at`,并补齐顶层 recall 字段归一化。
24
+ - 群消息 pull / legacy fallback 识别 `group.message_recalled` tombstone,避免把撤回通知作为普通群消息投递。
25
+ - P2P 与群 push 按 namespace 串行化处理,降低异步解密和投递导致的乱序风险。
26
+ - V2 P2P / Group pull 页内消息按 `seq` 排序后处理,避免服务端返回无序时影响本地 seq 推进。
27
+
28
+ ### 改进
29
+
30
+ - `RPCTransport` 的 `_meta` observer 支持异步回调;RPC 成功响应会等待 observer 完成,事件/通知路径统一走安全的 meta observer 分发。
31
+ - `getAnnouncement` / `getRules` / `getJoinRequirements` 优先使用 group.index settings cache;`updateAnnouncement` / `updateRules` / `updateJoinRequirements` 改走 `updateGroupIndex`,保持索引与设置同步。
32
+ - cross-sdk JS agent 支持 `sdk.update_group_index` 调用,便于跨 SDK 测试索引化群设置。
33
+ - SDK 包版本、运行时 `VERSION` 和 conformance 期望版本更新为 `0.5.3`。
34
+
35
+ ### 测试
36
+
37
+ - 新增 group.index 单元测试,覆盖 hash/etag、签名/验签、settings merge、RPC meta stale/fresh、async meta observer 和 IndexedDB 持久化恢复。
38
+ - 新增 GroupFacade group.index 单元测试,覆盖 CAS 写入、冲突重试、远端索引验签、tamper 拒绝、settings cache 和便利方法索引化写入。
39
+ - 新增浏览器 E2E:验证签名 `group.index` 写入、裸 settings 写入拒绝、CAS 冲突重试和最终 settings 一致性。
40
+ - 扩展撤回投递测试,覆盖 P2P/group recall 顶层字段归一化、push/pull tombstone 去重和有序投递。
41
+ - 更新 group settings 与签名审计 E2E,使公告/群规等索引化 settings 通过 `updateGroupIndex` 写入。
42
+
43
+ ---
44
+
9
45
  ## 0.5.2 — 2026-07-05
10
46
 
11
47
  ### 新功能
@@ -21,7 +21,8 @@
21
21
  | [消息收件箱统一迁移方案](design/消息收件箱统一迁移方案.md) | P2P `message_inbox` 与群消息 `group_inbox` 的统一读模型、后台回填和旧表清理方案 |
22
22
  | [AUN 反向代理服务方案与 TDD 实施计划](design/AUN反向代理服务方案与TDD实施计划.md) | AUN Service Proxy、service_proxy 服务模块、SDK service-proxy-client、URL 路由、隧道协议、Web 边界和分阶段 TDD 落地计划 |
23
23
  | [远程 agent.md 缓存与 ETag 透传方案](agent.md/远程agent.md缓存与etag透传方案.md) | 远程 agent.md per-AID 本地文件/IndexedDB 缓存、Gateway `_meta.agent_md_etags` 角色、消息信封 ETag 和注入节流方案 |
24
- | [SDK 文档索引](sdk/INDEX.md) | SDK 使用手册、RPC 手册、E2EE、Storage VFS、Group FS 和 Collab 的子索引 |
24
+ | [群索引版本提示与附件引用方案](design/群索引版本提示与附件引用方案.md) | `group.index` 签名索引、`_meta.group_indexes` 版本提示、CAS 更新、服务端缓存注入和附件稳定引用 |
25
+ | [SDK 文档索引](sdk/INDEX.md) | SDK 使用手册、RPC 手册、E2EE、Storage VFS、Group FS 和 Collab 的子索引 |
25
26
  | [SDK 查阅指南](sdk/AUN_DOCS_GUIDE.md) | SDK 文档按行区间渐进式查阅方法 |
26
27
  | [AUN CLI 手册](cli/CLI手册.md) | Python CLI 源码位置、安装运行入口、全局选项、profile 配置和主要命令集 |
27
28
  | [AUN CLI 设计文档](cli/AUN-CLI设计文档.md) | `python/src/aun_cli` 当前实现架构、命令注册面、配置解析、SDK 桥接和实现边界 |
@@ -76,6 +77,7 @@
76
77
  - `client.notify()` 在线轻量通知、AID/群路由、跨域 federation 和不离线存储边界 → [Notify 通知方案](sdk/Notify通知方案.md)
77
78
  - 协议细节、子协议和消息格式 → [协议文档目录](protocol/)
78
79
  - agent.md 远程缓存、`remote_etag` / `local_etag`、`requester` / `peer` / `group` 角色、消息信封与 Gateway `_meta` ETag 透传 → [远程 agent.md 缓存与 ETag 透传方案](agent.md/远程agent.md缓存与etag透传方案.md)
80
+ - `group.index` owner/admin SDK 生成签名索引、`_meta.group_indexes` 观察、`expected_index_etag` CAS、服务端正/负缓存与注入频率控制 → [群索引版本提示与附件引用方案](design/群索引版本提示与附件引用方案.md)、[SDK 文档索引](sdk/INDEX.md)
79
81
 
80
82
  ### Service Proxy 与服务暴露
81
83
 
@@ -103,9 +105,9 @@
103
105
 
104
106
  ## Layer 3:重点文档摘要
105
107
 
106
- ### aun测试运行指南
107
-
108
- 记录当前 AUN 服务与 SDK 在 Docker 单域、双域环境中的实际测试入口。包含 Python、TypeScript、Go、JavaScript 四语言测试矩阵,Python / TypeScript / Go / JavaScript 跨语言容器 E2E 的 83 用例矩阵,覆盖 P2P 明文/E2EE、群聊 pairwise 明文/E2EE、三/四成员同群矩阵、storage ticket/ACL、group.fs 与 group.fs POSIX、collab 与 collab ACL、连续消息、ack、预期失败和混合明文/E2EE 场景,另包含固定身份目录、bench-pairs16 性能身份池、uvloop bench 环境变量、Gateway 客户端 mock 网络延迟、`--perf-trace` 开关、容器名、典型命令、浏览器 E2E、双域 federation 测试、Service Proxy 单域/双域 E2E 入口、message/group WAL 回归检查和数据保护规则。
108
+ ### aun测试运行指南
109
+
110
+ 记录当前 AUN 服务与 SDK 在 Docker 单域、双域环境中的实际测试入口。包含 Python、TypeScript、Go、JavaScript 四语言测试矩阵和跨语言容器 E2E,覆盖 group.index 签名/CAS/meta 观察、P2P 明文/E2EE、群聊 pairwise 明文/E2EE、三/四成员同群矩阵、storage ticket/ACL、group.fs 与 group.fs POSIX、collab 与 collab ACL、连续消息、ack、预期失败和混合明文/E2EE 场景,另包含固定身份目录、bench-pairs16 性能身份池、uvloop bench 环境变量、Gateway 客户端 mock 网络延迟、`--perf-trace` 开关、容器名、典型命令、浏览器 E2E、双域 federation 测试、Service Proxy 单域/双域 E2E 入口、message/group WAL 回归检查和数据保护规则。
109
111
 
110
112
  ### AUN SDK 重构修改清单
111
113
 
@@ -147,13 +149,17 @@
147
149
 
148
150
  定义 AUN Service Proxy / AUN 服务代理的整体方案:服务侧新增 `service_proxy` 模块,`service-proxy-server` 负责公网 HTTP/HTTPS 入口、WSS 隧道、在线连接索引和协议桥接;SDK 侧 `service-proxy-client` 负责 provider 侧 embedded registry、本地 endpoint 调用和服务摘要上报。方案明确去掉 ACP GlobalRegistry/RSA 同步,URL 以 `https://proxy.{issuer}/{user_name}/{svc_name}/...` 为 canonical,`https://{user_name}.{issuer}/proxy/{svc_name}/...` 由 NameService 跳转;Web 服务推荐 host-root 模式,目录式 path-prefix 只做受限转发。文档还按 Phase 0 到 Phase 11 给出 TDD 实施步骤,记录 Phase 10 已新增宿主机进程内 7 类 HTTP/SSE/WS/NameService/Web/ACL/双域边界 E2E,以及单域和双域 Docker E2E 脚本入口;真实 Docker 执行仍需先满足模块启用、镜像包含新模块和 `/ws/client` AUN 身份 resolver 前置条件。
149
151
 
150
- ### 远程 agent.md 缓存与 ETag 透传方案
151
-
152
+ ### 远程 agent.md 缓存与 ETag 透传方案
153
+
152
154
  定义每个远程 AID 在 SDK 内存和本地持久化记录中维护一条 agent.md 状态:Python / TypeScript / Go 使用 `{aun_path}/AIDs/{aid}/agent.md` 与 `agentmd.json`,浏览器 JavaScript 使用 IndexedDB logical key。方案规定 Gateway 在 RPC response / event push 的 `_meta.agent_md_etags` 中按 `requester`、`peer`、`group` 注入元数据,保留旧别名兼容,并通过 300 秒正缓存、60 秒负缓存和默认 60 秒发送节流控制热路径开销;Message Service V2 P2P 信封携带 `agent_md.sender`。四端 SDK 自动观察 `_meta` 和信封 `agent_md.sender/group`,写入 `remote_etag` / `last_modified`,并遵守按需下载、无条件 GET、304 兼容、竞态和跨 SDK 一致性规则。
153
-
154
- ### SDK 文档索引
155
-
156
- `docs/sdk/INDEX.md` SDK 手册的三层子索引,覆盖快速开始、WebSocket 协议、核心概念、连接认证、E2EE V2、API 手册、错误处理、最佳实践、payload、Service Proxy、Storage VFS、Group FS、Collab GC/reflog/reset 和各类 RPC 手册。
155
+
156
+ ### 群索引版本提示与附件引用方案
157
+
158
+ 定义 `group.index` owner/admin SDK 生成、canonical JSONL、签名、`etag` / `body_hash`、`expected_index_etag` CAS、`_meta.group_indexes` 版本提示、Gateway/Message 转发边界、服务端正/负缓存、singleflight、写后失效/刷新、注入频率控制,以及 DB 保存核心设置、group.fs 保存大附件、附件稳定引用和 SDK `check/get/updateGroupIndex` 语义。
159
+
160
+ ### SDK 文档索引
161
+
162
+ `docs/sdk/INDEX.md` 是 SDK 手册的三层子索引,覆盖快速开始、WebSocket 协议、核心概念、连接认证、E2EE V2、API 手册、错误处理、最佳实践、payload、Service Proxy、Storage VFS、Group FS、Group Index、Collab GC/reflog/reset 和各类 RPC 手册。
157
163
 
158
164
  ### Service Proxy RPC 手册
159
165
 
@@ -47,6 +47,7 @@ AUN SDK Core 文档在 `docs/` 下。根级索引为 `docs/INDEX.md`,SDK API
47
47
  | 服务端消息通信诊断总体方案 | `docs/design/AUN服务端消息通信诊断面板方案.md` L3-47 |
48
48
  | 服务端消息通信 P0 诊断面板 | `docs/design/服务端消息通信诊断面板P0方案.md` L3-73 |
49
49
  | P2P / Group 消息 inbox 统一迁移与旧表清理 | `docs/design/消息收件箱统一迁移方案.md` |
50
+ | group.index 签名索引、`_meta.group_indexes`、CAS 更新和服务端缓存注入 | `docs/design/群索引版本提示与附件引用方案.md` L1-348、`docs/INDEX.md` L24、L80、L156 |
50
51
  | AUN Service Proxy 总体架构、参考项目与边界 | `docs/design/AUN反向代理服务方案与TDD实施计划.md` L3-127 |
51
52
  | AUN Service Proxy URL、注册、隧道协议和 Web 边界 | `docs/design/AUN反向代理服务方案与TDD实施计划.md` L129-384 |
52
53
  | AUN Service Proxy 服务列表注册、双注册和 wakeup 路由 | `docs/sdk/09-proxy-rpc-manual.md` L1-226、`docs/protocol/06-服务协议.md` L43-204 |
@@ -58,7 +59,7 @@ AUN SDK Core 文档在 `docs/` 下。根级索引为 `docs/INDEX.md`,SDK API
58
59
  | test-control HTTP API | `docs/design/跨语言容器E2E测试方案.md` L160-305 |
59
60
  | 客户端容器要求和 Compose 建议 | `docs/design/跨语言容器E2E测试方案.md` L307-411 |
60
61
  | test-runner 标准用例流程 | `docs/design/跨语言容器E2E测试方案.md` L413-440 |
61
- | Python / TypeScript / Go / JavaScript 跨 SDK 测试矩阵 | `docs/aun测试运行指南.md` L202-228 |
62
+ | Python / TypeScript / Go / JavaScript 跨 SDK 测试矩阵与 group.index 覆盖 | `docs/aun测试运行指南.md` L202-229、L321-346 |
62
63
  | 跨语言日志、trace、身份隔离、CLI 定位 | `docs/design/跨语言容器E2E测试方案.md` L514-576 |
63
64
  | 失败分类与落地阶段 | `docs/design/跨语言容器E2E测试方案.md` L579-625 |
64
65
  | 与现有测试环境的关系和验收标准 | `docs/design/跨语言容器E2E测试方案.md` L627-665 |
@@ -66,7 +67,8 @@ AUN SDK Core 文档在 `docs/` 下。根级索引为 `docs/INDEX.md`,SDK API
66
67
  | agent.md ETag 透传时序图 | `docs/agent.md/远程agent.md缓存与etag透传方案.md` L129-239 |
67
68
  | agent.md 服务端与 SDK 实现流程 | `docs/agent.md/远程agent.md缓存与etag透传方案.md` L241-319 |
68
69
  | agent.md 本地持久化、竞态和测试点 | `docs/agent.md/远程agent.md缓存与etag透传方案.md` L321-370 |
69
- | SDK API、RPC、E2EE、Storage VFS、Group FS、Collab GC/reflog/reset 使用细节 | `docs/sdk/AUN_DOCS_GUIDE.md` |
70
+ | SDK API、RPC、E2EE、Storage VFS、Group FS、Collab GC/reflog/reset 使用细节 | `docs/sdk/AUN_DOCS_GUIDE.md` |
71
+ | SDK group.index facade、`check/get/updateGroupIndex` 和 CAS 冲突处理 | `docs/sdk/06-API手册.md` L340-370、`docs/sdk/09-group-rpc-manual.md` L1015-1095、`docs/sdk/07-错误处理.md` |
70
72
  | AUN Python CLI 源码位置、安装入口、全局选项、profile 配置和主要命令集 | `docs/cli/CLI手册.md` L3-325 |
71
73
  | AUN Python CLI 当前实现架构、命令注册、SDK 桥接和实现边界 | `docs/cli/AUN-CLI设计文档.md` L3-265 |
72
74
  | AUN Storage 架构、SDK VFS、direct backend 数据面、类 Linux 权限和 mount/symlink | `docs/aun-fs/AUN Storage架构设计.md` L16-47、L74-120、L183-228、L289-315 |
@@ -26,50 +26,50 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
26
26
 
27
27
  ### Group 对象
28
28
 
29
- | 字段 | 类型 | 说明 |
30
- |------|------|------|
31
- | `group_aid` | string | 群组主标识,目标态格式为 `{base}.{issuer-domain}` |
32
- | `group_id` | string | 兼容字段;新群通常等于 `group_aid`,旧群可能保留历史值 |
33
- | `name` | string | 群组名称 |
34
- | `owner_aid` | string | 群主 AID |
35
- | `creator_aid` | string | 创建者 AID |
36
- | `visibility` | string | `"public"` / `"private"` |
37
- | `status` | string | `"active"` / `"suspended"` / `"dissolved"` |
29
+ | 字段 | 类型 | 说明 |
30
+ |------|------|------|
31
+ | `group_aid` | string | 群组主标识,目标态格式为 `{base}.{issuer-domain}` |
32
+ | `group_id` | string | 兼容字段;新群通常等于 `group_aid`,旧群可能保留历史值 |
33
+ | `name` | string | 群组名称 |
34
+ | `owner_aid` | string | 群主 AID |
35
+ | `creator_aid` | string | 创建者 AID |
36
+ | `visibility` | string | `"public"` / `"private"` |
37
+ | `status` | string | `"active"` / `"suspended"` / `"dissolved"` |
38
38
  | `description` | string | 群组描述 |
39
39
  | `metadata` | object | 自定义元数据 |
40
- | `dispatch_mode` | string | 群分发模式:`"broadcast"`(默认)/ `"mention"`,详见 [10.2.x 群分发模式](#1023-群分发模式dispatch_mode) |
40
+ | `dispatch_mode` | string | 群分发模式:`"broadcast"`(默认)/ `"mention"`,详见 [10.2.3 群分发模式](#1023-群分发模式dispatch_mode) |
41
41
  | `member_count` | integer | 成员数量 |
42
42
  | `message_seq` | integer | 最新消息序号 |
43
43
  | `event_seq` | integer | 最新事件序号 |
44
- | `created_at` | integer | 创建时间(Unix 毫秒) |
45
-
46
- ### Group AID / Group ID 兼容规范
47
-
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-` 开头,避免与群标识混淆。
44
+ | `created_at` | integer | 创建时间(Unix 毫秒) |
45
+
46
+ ### Group AID / Group ID 兼容规范
47
+
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-` 开头,避免与群标识混淆。
49
49
 
50
50
  **支持的 base 格式**(不含域名部分):
51
51
  - **Legacy 格式**: `g-[a-z0-9]{4,32}` — 以 `g-` 开头,后接 4 到 32 位小写字母或数字
52
52
  - **新格式**: `[a-z0-9]{5,}` — 5 位或更多小写字母或数字,无上限
53
53
  - **Group name 格式**: `[a-z0-9][a-z0-9_-]{3,63}` — 4 到 64 个字符,可包含下划线和短横线
54
54
 
55
- 服务端必须接受以下输入形式,并在 API 边界统一为目标态 `group_aid`:
56
-
57
- | 输入形式 | 用途 | 规范化结果 |
58
- |----------|------|----------------|
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` |
63
-
64
- 规范化规则:
65
-
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}` 简写链接可继续由服务端兼容解析。
55
+ 服务端必须接受以下输入形式,并在 API 边界统一为目标态 `group_aid`:
56
+
57
+ | 输入形式 | 用途 | 规范化结果 |
58
+ |----------|------|----------------|
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` |
63
+
64
+ 规范化规则:
65
+
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}` 简写链接可继续由服务端兼容解析。
73
73
 
74
74
  ### 10.2.3 群分发模式(dispatch_mode)
75
75
 
@@ -102,20 +102,20 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
102
102
 
103
103
  ### Member 对象
104
104
 
105
- | 字段 | 类型 | 说明 |
106
- |------|------|------|
107
- | `aid` | string | 成员 AID |
108
- | `group_id` | string | 群组标识兼容字段,值语义为 `group_aid` |
109
- | `role` | string | `"owner"` / `"admin"` / `"member"` |
110
- | `joined_at` | integer | 加入时间(Unix 毫秒) |
111
- | `last_ack_seq` | integer | 最后已读消息序号 |
105
+ | 字段 | 类型 | 说明 |
106
+ |------|------|------|
107
+ | `aid` | string | 成员 AID |
108
+ | `group_id` | string | 群组标识兼容字段,值语义为 `group_aid` |
109
+ | `role` | string | `"owner"` / `"admin"` / `"member"` |
110
+ | `joined_at` | integer | 加入时间(Unix 毫秒) |
111
+ | `last_ack_seq` | integer | 最后已读消息序号 |
112
112
 
113
113
  ### Message 对象
114
114
 
115
- | 字段 | 类型 | 说明 |
116
- |------|------|------|
117
- | `group_id` | string | 群组标识兼容字段,值语义为 `group_aid` |
118
- | `seq` | integer | 消息序号(群内单调递增) |
115
+ | 字段 | 类型 | 说明 |
116
+ |------|------|------|
117
+ | `group_id` | string | 群组标识兼容字段,值语义为 `group_aid` |
118
+ | `seq` | integer | 消息序号(群内单调递增) |
119
119
  | `message_id` | string | 消息 UUID |
120
120
  | `sender_aid` | string | 发送者 AID |
121
121
  | `message_type` | string | 信封/封装类型,如 `e2ee.group_encrypted`;业务负载类型在 `payload.type` 中 |
@@ -151,11 +151,11 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
151
151
 
152
152
  **参数**:
153
153
 
154
- | 参数 | 类型 | 必填 | 说明 |
155
- |------|------|:----:|------|
156
- | `name` | string | ✅ | 群组名称 |
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}` |
154
+ | 参数 | 类型 | 必填 | 说明 |
155
+ |------|------|:----:|------|
156
+ | `name` | string | ✅ | 群组名称 |
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}` |
159
159
  | `visibility` | string | ❌ | `"public"` / `"private"`,默认由服务配置决定 |
160
160
  | `description` | string | ❌ | 群组描述 |
161
161
  | `metadata` | object | ❌ | 自定义元数据 |
@@ -168,10 +168,10 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
168
168
 
169
169
  ```json
170
170
  {
171
- "group": {
172
- "group_id": "g-abc123.agentid.pub",
173
- "group_aid": "g-abc123.agentid.pub",
174
- "name": "测试群",
171
+ "group": {
172
+ "group_id": "g-abc123.agentid.pub",
173
+ "group_aid": "g-abc123.agentid.pub",
174
+ "name": "测试群",
175
175
  "owner_aid": "alice.agentid.pub",
176
176
  "creator_aid": "alice.agentid.pub",
177
177
  "visibility": "private",
@@ -179,7 +179,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
179
179
  "member_count": 1,
180
180
  "message_seq": 0,
181
181
  "event_seq": 0,
182
- "created_at": 1234567890000
182
+ "created_at": 1234567890000
183
183
  },
184
184
  "aid": "alice.agentid.pub"
185
185
  }
@@ -193,7 +193,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
193
193
 
194
194
  | 参数 | 类型 | 必填 | 说明 |
195
195
  |------|------|:----:|------|
196
- | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
196
+ | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
197
197
  | `required` | string[] | ❌ | 可选值:`member` / `state` / `e2ee` / `avatar` |
198
198
 
199
199
  **响应**:平铺对象。默认字段包含 `found`、`group_id`、`group_aid`、`name`、`visibility`、`status`、`description`、`member_count`、`created_at`。
@@ -261,7 +261,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
261
261
 
262
262
  | 参数 | 类型 | 必填 | 说明 |
263
263
  |------|------|:----:|------|
264
- | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
264
+ | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
265
265
  | `aid` | string | ✅ | 要添加的 AID |
266
266
  | `role` | string | ❌ | `"member"` / `"admin"`,默认 `"member"` |
267
267
  | `member_type` | string | ❌ | `"human"` / `"ai"`,默认 `"human"` |
@@ -308,7 +308,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
308
308
 
309
309
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
310
310
  |------|------|:----:|--------|------|
311
- | `group_id` | string | ✅ | — | 群组标识兼容字段,值语义为 `group_aid` |
311
+ | `group_id` | string | ✅ | — | 群组标识兼容字段,值语义为 `group_aid` |
312
312
  | `page` | integer | ❌ | 1 | 页码 |
313
313
  | `size` | integer | ❌ | 50 | 每页条数 |
314
314
  | `role` | string | ❌ | — | 按角色过滤 |
@@ -351,14 +351,14 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
351
351
 
352
352
  | 参数 | 类型 | 必填 | 说明 |
353
353
  |------|------|:----:|------|
354
- | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
354
+ | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
355
355
  | `type` | string | ❌ | 信封/封装类型,普通业务消息无需填写;SDK 加密群消息时自动使用 `e2ee.group_encrypted` |
356
356
  | `payload` | object | ✅ | 消息内容 |
357
357
  | `attachments` | array | ❌ | 存储引用列表 |
358
358
 
359
359
  ##### Payload 参考约定
360
360
 
361
- `group.send.params.payload` 的统一业务负载格式见 [消息Payload参考约定](../sdk/消息Payload参考约定.md)。完整群消息请求仍在 `payload` 同级传入 `group_id`(兼容参数名,值使用目标态 `group_aid`);业务类型放在 `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` 信封/封装类型混用。
362
362
 
363
363
  协议层只要求 `payload` 是 JSON 对象,并按服务端配置做大小、信封/封装类型和 E2EE epoch 相关检查;字段语义由应用层约定,接收端应对未知 `payload.type`、未知 `kind` 和缺失展示字段做降级处理。
364
364
 
@@ -399,9 +399,9 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
399
399
 
400
400
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
401
401
  |------|------|:----:|--------|------|
402
- | `group_id` | string | ✅ | — | 群组标识兼容字段,值语义为 `group_aid` |
402
+ | `group_id` | string | ✅ | — | 群组标识兼容字段,值语义为 `group_aid` |
403
403
  | `after_message_seq` | integer | ❌ | 0 | 拉取该 seq 之后的消息 |
404
- | `limit` | integer | ❌ | 50 | 最大条数(最大 50;`pull_max_limit` 配置只能进一步收紧) |
404
+ | `limit` | integer | ❌ | 50 | 最大条数(最大 50;`pull_max_limit` 配置只能进一步收紧) |
405
405
  | `device_id` | string | ❌ | — | 设备 ID(多设备模式) |
406
406
 
407
407
  **响应**:
@@ -412,7 +412,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
412
412
  "messages": [ ... ],
413
413
  "latest_message_seq": 42,
414
414
  "has_more": false,
415
- "limit": 50
415
+ "limit": 50
416
416
  }
417
417
  ```
418
418
 
@@ -446,7 +446,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
446
446
 
447
447
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
448
448
  |------|------|:----:|--------|------|
449
- | `group_id` | string | ✅ | — | 群组标识兼容字段,值语义为 `group_aid` |
449
+ | `group_id` | string | ✅ | — | 群组标识兼容字段,值语义为 `group_aid` |
450
450
  | `status` | string | ❌ | `"pending"` | `"pending"` / `"approved"` / `"rejected"` |
451
451
  | `page` | integer | ❌ | 1 | 页码 |
452
452
  | `size` | integer | ❌ | 50 | 每页条数 |
@@ -461,7 +461,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
461
461
 
462
462
  | 参数 | 类型 | 必填 | 说明 |
463
463
  |------|------|:----:|------|
464
- | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
464
+ | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
465
465
  | `aid` | string | ✅ | 申请人 AID |
466
466
  | `approve` | boolean | ❌ | 批准(true)或拒绝(false),默认 true |
467
467
  | `reason` | string | ❌ | 拒绝原因 |
@@ -484,7 +484,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
484
484
 
485
485
  | 参数 | 类型 | 必填 | 说明 |
486
486
  |------|------|:----:|------|
487
- | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
487
+ | `group_id` | string | ✅ | 群组标识兼容字段,值语义为 `group_aid` |
488
488
  | `code` | string | ❌ | 自定义邀请码,不提供则自动生成 |
489
489
  | `max_uses` | integer | ❌ | 最大使用次数,默认 1,必须 > 0 |
490
490
  | `expires_in_seconds` | integer | ❌ | 有效期(秒),默认由配置决定(7 天) |
@@ -567,7 +567,130 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
567
567
 
568
568
  ---
569
569
 
570
- ## 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 事件
571
694
 
572
695
  Group 服务通过 `event/group.*` 事件推送变更通知给相关 AID。
573
696
 
@@ -616,12 +739,12 @@ Group 服务通过 `event/group.*` 事件推送变更通知给相关 AID。
616
739
  | `invite_code_used` | 邀请码使用 |
617
740
  | `invite_code_revoked` | 邀请码撤销 |
618
741
  | `member_banned` | 成员被封禁 |
619
- | `member_unbanned` | 成员解除封禁 |
620
- | `suspended` | 群组暂停 |
621
- | `resumed` | 群组恢复 |
622
- | `dissolved` | 群组解散 |
623
-
624
- ### `event/group.message_created`
742
+ | `member_unbanned` | 成员解除封禁 |
743
+ | `suspended` | 群组暂停 |
744
+ | `resumed` | 群组恢复 |
745
+ | `dissolved` | 群组解散 |
746
+
747
+ ### `event/group.message_created`
625
748
 
626
749
  群内新消息时推送给所有在线成员。支持两种模式:
627
750
 
@@ -661,7 +784,7 @@ Group 服务通过 `event/group.*` 事件推送变更通知给相关 AID。
661
784
 
662
785
  ---
663
786
 
664
- ## 10.12 错误码
787
+ ## 10.15 错误码
665
788
 
666
789
  | 错误码 | 说明 | 客户端处理 |
667
790
  |--------|------|-----------|
@@ -669,7 +792,7 @@ Group 服务通过 `event/group.*` 事件推送变更通知给相关 AID。
669
792
  | -32602 | Invalid params(如缺少 group_id) | 检查参数 |
670
793
  | -32004 | Permission denied(权限不足) | 提示用户,不重试 |
671
794
  | -32001 | Authentication failed | 重新认证 |
672
- | -33001 | Group not found | 检查规范化后的 `group_aid`(`group_id` 为兼容参数名) |
795
+ | -33001 | Group not found | 检查规范化后的 `group_aid`(`group_id` 为兼容参数名) |
673
796
  | -33002 | Group state invalid(群状态不允许该操作) | 检查群状态 |
674
797
  | -33003 | Group suspended | 等待恢复或联系管理员 |
675
798
  | -33004 | Group member limit reached | 不重试 |
@@ -679,11 +802,15 @@ Group 服务通过 `event/group.*` 事件推送变更通知给相关 AID。
679
802
  | -33008 | Invite code invalid or expired | 获取新邀请码 |
680
803
  | -33009 | Join rejected | 不重试 |
681
804
 
805
+ `group.index etag conflict` 表示 `expected_index_etag` 与服务端当前 `group.index` etag 不一致。客户端应先重新读取 `group.index`,在最新 index 上合并本地修改并重新签名后再提交。
806
+
682
807
  ---
683
808
 
684
- ## 10.13 设计约束与实现说明
809
+ ## 10.16 设计约束与实现说明
685
810
 
686
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`。
687
814
  - **消息 seq 单调递增**:per-group 粒度,确保顺序一致性,`ack_seq` 仅增不减。
688
815
  - **事件 seq 独立计数**:`event_seq` 与 `message_seq` 独立;消息增量拉取使用 `group.pull`,事件增量拉取使用 `group.pull_events`。
689
816
  - **duty 模式**:`duty_mode` 非 `"none"` 且 `duty_human_message_policy = "dispatch"` 时,消息先推送给当班成员处理,回复后再广播;`group.pull` 始终可拉取全量消息。
@@ -38,10 +38,11 @@ AUN 是 ACP 协议的 2.0 版本,采用 WebSocket + JSON-RPC 2.0 定义 Agent
38
38
  | 文档 | 内容 |
39
39
  |------|------|
40
40
  | [06-服务协议.md](06-服务协议.md) | 业务层方法:message.* / meta.* / search.* / task.* / 跨域消息路由 / E2EE 摘要 / `pki.{issuer}` 与 `ct.{issuer}` 公开端点 |
41
- | [07-错误码与状态机.md](07-错误码与状态机.md) | 错误码分层汇总、各模式状态机、可重试/不可重试分类 |
41
+ | [07-错误码与状态机.md](07-错误码与状态机.md) | 错误码分层汇总、各模式状态机、可重试/不可重试分类 |
42
42
  | [08-AUN-E2EE.md](08-AUN-E2EE.md) | Legacy P2P E2EE 信封说明;当前默认主路径见 SDK V2 多设备 wrap 文档 |
43
43
  | [08-AUN-E2EE-Group.md](08-AUN-E2EE-Group.md) | 群组 E2EE V2:消息级密钥、逐设备密钥包裹、成员状态签名验证 |
44
- | [16-系统目录保护方案.md](16-系统目录保护方案.md) | `memberdata` `group_data` 的系统目录保护、`group_data` 目录树隐藏与读下载/写保护边界、Group FS 授权路径和配额归属 |
44
+ | [10-Group-子协议.md](10-Group-子协议.md) | `group.*` 群组管理、群消息、`group.index` 签名索引、`_meta.group_indexes` CAS 更新 |
45
+ | [16-系统目录保护方案.md](16-系统目录保护方案.md) | `memberdata` 与 `group_data` 的系统目录保护、`group_data` 目录树隐藏与读下载/写保护边界、Group FS 授权路径和配额归属 |
45
46
 
46
47
  ### 附录
47
48
 
@@ -41,8 +41,9 @@ AUN 协议采用**主协议 + 子协议**架构:
41
41
  | Gateway 模式接入 | 03-Gateway-连接模式.md |
42
42
  | Peer 直连认证 | 04-Peer-子协议.md |
43
43
  | Relay 中继 | 05-Relay-子协议.md |
44
- | 消息收发、搜索、任务 | 06-服务协议.md |
45
- | 错误码和状态机 | 07-错误码与状态机.md |
44
+ | 消息收发、搜索、任务 | 06-服务协议.md |
45
+ | 群组、group.index 签名索引和 CAS | 10-Group-子协议.md |
46
+ | 错误码和状态机 | 07-错误码与状态机.md |
46
47
  | E2EE 加密 | ../sdk/E2EE_V2消息通信时序图.md / 08-AUN-E2EE-Group.md;旧信封查 08-AUN-E2EE.md |
47
48
  | 安全威胁和防护 | 09-安全考虑.md |
48
49
  | 客户端接入代码示例 | 附录J-客户端接入示例.md |