@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
@@ -103,7 +103,7 @@
103
103
  | [group.set_settings](#groupset_settings) | 统一设置群参数(含公告、规则、入群要求、dispatch_mode 等) |
104
104
  | [group.get_settings](#groupget_settings) | 统一读取群参数 |
105
105
 
106
- **便利方法**:SDK 提供向后兼容的便利方法(`getAnnouncement`/`updateAnnouncement`/`getRules`/`updateRules`/`getJoinRequirements`/`updateJoinRequirements`),内部调用 `set_settings`/`get_settings`,返回旧格式。新代码建议直接使用 `set_settings`/`get_settings`。
106
+ **便利方法**:SDK 提供向后兼容的便利方法(`getAnnouncement`/`updateAnnouncement`/`getRules`/`updateRules`/`getJoinRequirements`/`updateJoinRequirements`)。读取方法优先返回 SDK 本地缓存,本地没有对应值时才调用 `get_settings` 初始化;即使观察到远端 etag 不一致也不会自动 pull 远端。indexed 写入方法内部调用 `updateGroupIndex` 生成签名 `group.index` 并通过 `set_settings` CAS 提交。
107
107
 
108
108
  ### 群文件系统
109
109
 
@@ -137,15 +137,17 @@
137
137
 
138
138
  ---
139
139
 
140
- ## Group ID 规范
141
-
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`。
140
+ ## Group AID / Group ID 兼容规范
141
+
142
+ 目标态群组主标识是 `group_aid`,canonical 形式为 `{base}.{issuer-domain}`,例如 `10042.agentid.pub`、`team01.agentid.pub`、`g-abc123.agentid.pub`。新建群以 `group_aid` 为准;新群的兼容 `group_id` 列值也使用同一个 `group_aid` 字符串。历史 `group_id` 字段名和 RPC 参数名继续保留,但语义上只是兼容字段。
143
+
144
+ SDK 发起 `group.*` 调用时会把传入的 `group_id` / `groupId` / `group_aid` / `groupAid` 统一规范化为 `group_aid`。裸客户端也应使用同一 `group_aid` 生成签名材料和 E2EE AAD,避免同一群的历史别名产生不同材料。服务端响应可能同时返回 `group_id` `group_aid`;新代码应优先读取 `group_aid`,仅兼容旧版本或历史数据时回退读取 `group_id`。
145
+
146
+ 兼容输入包括目标态 `{base}.{issuer-domain}`、本域简写 `{base}` / `g-{slug}`,以及旧格式 `group.{issuer-domain}/{base}`、`{base}@issuer-domain`、`g-{slug}@issuer-domain`、`g-{slug}.{issuer-domain}`。带域的旧输入会转换为 `{base}.{issuer-domain}`;本域简写会在服务端或 SDK 有本域 issuer 配置时补成本域 `group_aid`。`base` 支持 5 位及以上小写字母或数字,或 4 到 64 位 `[a-z0-9_-]` 风格名称;旧 `g-` 前缀形式继续兼容,`g-` 后为 4 到 32 位小写字母或数字。命名群使用 `group_name` 作为 base,规则见 `group.create` 参数说明。
147
+
148
+ `group.create` 的新建语义以 `group_aid` 为准:命名群由 `group_name + issuer` 生成 `group_aid`,自动群由服务端群号生成 `{number}.{issuer}`。`group_id` 参数只作为旧客户端兼容别名;传入时不能是纯数字(纯数字群号保留给服务端自动分配),且规范化后的 `group_aid` 未被占用。如果已被占用或与历史别名碰撞会返回错误。
149
+
150
+ 在 `https://group.issuer-domain/...` 这类群链接中,path 使用单段 `group_aid`,例如 `https://group.agentid.pub/10042.agentid.pub/invite/ic-xxx`、`https://group.agentid.pub/g-abc123.agentid.pub/invite/ic-xxx`。历史 base 简写链接可继续由服务端兼容解析。
149
151
 
150
152
  ---
151
153
 
@@ -153,15 +155,16 @@
153
155
 
154
156
  ### group.create
155
157
 
156
- 创建群组。调用者自动成为 owner。支持创建命名群(传入 `group_name` + `public_key`)。
158
+ 创建群组。调用者自动成为 owner。支持创建命名群(传入 `group_name` + `public_key`)。新建群主标识以 `group_aid` 为准;`group_id` 仅作为兼容字段保留。
157
159
 
158
160
  **参数**:
159
161
 
160
162
  | 参数 | 类型 | 必填 | 说明 |
161
163
  |------|------|------|------|
162
164
  | `name` | string | 是 | 群组显示名称 |
163
- | `group_id` | string | 否 | 自定义群 ID;不提供则服务端自动生成 |
164
- | `group_name` | string | 否 | 命名群标识,4-64 字符,`[a-z0-9_-]+`,不以 `guest`/`g-` 开头。与 `public_key` 同时提供时创建命名群 |
165
+ | `group_aid` | string | 否 | 目标态群 AID;新代码优先使用。传入时会规范化为 `{base}.{issuer-domain}`,不能是纯数字 |
166
+ | `group_id` | string | 否 | 兼容旧客户端的别名;值语义同 `group_aid`,不再推荐新代码使用 |
167
+ | `group_name` | string | 否 | 命名群标识,4-64 字符,`[a-z0-9_-]+`,不以 `guest`/`g-` 开头。与 `public_key` 同时提供时创建命名群,并生成 `{group_name}.{issuer-domain}` |
165
168
  | `public_key` | string | 否 | 命名群公钥(base64 编码),与 `group_name` 同时提供 |
166
169
  | `curve` | string | 否 | 密钥曲线,默认 `"P-256"` |
167
170
  | `visibility` | string | 否 | `"public"` / `"private"`,默认由配置决定 |
@@ -178,7 +181,8 @@
178
181
  ```json
179
182
  {
180
183
  "group": {
181
- "group_id": "group.agentid.pub/10001",
184
+ "group_id": "my-team.agentid.pub",
185
+ "group_aid": "my-team.agentid.pub",
182
186
  "name": "测试群",
183
187
  "owner_aid": "alice.agentid.pub",
184
188
  "creator_aid": "alice.agentid.pub",
@@ -189,10 +193,9 @@
189
193
  "member_count": 1,
190
194
  "message_seq": 0,
191
195
  "event_seq": 0,
192
- "group_url": "https://group.agentid.pub/10001",
193
- "group_aid": "my-team.agentid.pub",
194
- "created_at": 1234567890,
195
- "updated_at": 1234567890
196
+ "group_url": "https://group.agentid.pub/my-team.agentid.pub",
197
+ "created_at": 1234567890000,
198
+ "updated_at": 1234567890000
196
199
  },
197
200
  "aid_cert": {
198
201
  "cert": "-----BEGIN CERTIFICATE-----...",
@@ -204,9 +207,9 @@
204
207
  }
205
208
  ```
206
209
 
207
- > `aid_cert` 仅在命名群创建时返回。`group_aid` `group_url` 仅在命名群时存在。
208
-
209
- **Group ID 格式**:新格式 `group.{issuer}/{group_no_or_name}`,旧格式 `{digits}.{issuer}` API 返回时自动转换。
210
+ > `aid_cert` 仅在命名群创建时返回。`group_aid` 是新代码应使用的主标识;`group_id` 为兼容字段,新群通常与 `group_aid` 相同,历史群可能保留旧存储值。
211
+
212
+ **标识格式**:目标态为 `{base}.{issuer-domain}`。旧格式 `group.{issuer-domain}/{base}`、`{base}@{issuer-domain}` 会在 API 边界转换为目标态 `group_aid`。
210
213
 
211
214
  ### group.bind_aid
212
215
 
@@ -216,7 +219,7 @@
216
219
 
217
220
  | 参数 | 类型 | 必填 | 说明 |
218
221
  |------|------|------|------|
219
- | `group_id` | string | 是 | 群组 ID |
222
+ | `group_id` | string | 是 | 群组标识;兼容参数名,值使用目标态 `group_aid` |
220
223
  | `group_name` | string | 是 | 命名群标识,4-64 字符,`[a-z0-9_-]+` |
221
224
  | `public_key` | string | 是 | 群公钥(base64 编码) |
222
225
  | `curve` | string | 否 | 密钥曲线,默认 `"P-256"` |
@@ -238,7 +241,7 @@
238
241
 
239
242
  | 参数 | 类型 | 必填 | 说明 |
240
243
  |------|------|------|------|
241
- | `group_id` | string | 是 | 群组 ID |
244
+ | `group_id` | string | 是 | 群组标识;兼容参数名,值使用目标态 `group_aid` |
242
245
  | `required` | string[] | 否 | 受限字段声明:`member`、`state`、`e2ee`、`avatar` |
243
246
 
244
247
  **默认响应**:
@@ -253,7 +256,7 @@
253
256
  "status": "active",
254
257
  "description": "技术讨论群",
255
258
  "member_count": 42,
256
- "created_at": 1234567890
259
+ "created_at": 1234567890000
257
260
  }
258
261
  ```
259
262
 
@@ -269,7 +272,7 @@
269
272
 
270
273
  | 参数 | 类型 | 必填 | 说明 |
271
274
  |------|------|------|------|
272
- | `group_id` | string | 是 | 群组 ID |
275
+ | `group_id` | string | 是 | 群组标识;兼容参数名,值使用目标态 `group_aid` |
273
276
  | `name` | string | 否 | 新名称 |
274
277
  | `visibility` | string | 否 | 新可见性 |
275
278
  | `description` | string | 否 | 新描述 |
@@ -298,7 +301,7 @@
298
301
  "name": "项目讨论",
299
302
  "visibility": "private",
300
303
  "member_count": 5,
301
- "updated_at": 1234567890,
304
+ "updated_at": 1234567890000,
302
305
  "role": "owner"
303
306
  }
304
307
  ],
@@ -340,7 +343,7 @@
340
343
 
341
344
  暂停群组。暂停期间不能发送消息。需要 **admin 及以上**权限。
342
345
 
343
- **参数**:`group_id` (string, 必填)
346
+ **参数**:`group_id`(string,必填;兼容字段,值使用目标态 `group_aid`)
344
347
 
345
348
  **响应**:
346
349
 
@@ -357,7 +360,7 @@
357
360
 
358
361
  恢复暂停的群组。需要 **admin 及以上**权限。
359
362
 
360
- **参数**:`group_id` (string, 必填)
363
+ **参数**:`group_id`(string,必填;兼容字段,值使用目标态 `group_aid`)
361
364
 
362
365
  **响应**:
363
366
 
@@ -374,7 +377,7 @@
374
377
 
375
378
  永久解散群组。不可恢复。需要 **owner** 权限。
376
379
 
377
- **参数**:`group_id` (string, 必填)
380
+ **参数**:`group_id`(string,必填;兼容字段,值使用目标态 `group_aid`)
378
381
 
379
382
  **响应**:
380
383
 
@@ -398,7 +401,7 @@
398
401
 
399
402
  | 参数 | 类型 | 必填 | 说明 |
400
403
  |------|------|------|------|
401
- | `group_id` | string | 是 | 群组 ID |
404
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
402
405
  | `aid` | string | 是 | 要添加的 AID |
403
406
  | `role` | string | 否 | `"admin"` / `"member"`,默认 `"member"` |
404
407
  | `member_type` | string | 否 | `"human"` / `"ai"`,默认 `"human"` |
@@ -412,7 +415,7 @@
412
415
  "aid": "bob.agentid.pub",
413
416
  "role": "member",
414
417
  "member_type": "human",
415
- "joined_at": 1234567890
418
+ "joined_at": 1234567890000
416
419
  }
417
420
  }
418
421
  ```
@@ -425,7 +428,7 @@
425
428
 
426
429
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
427
430
  |------|------|------|--------|------|
428
- | `group_id` | string | 是 | — | 群组 ID |
431
+ | `group_id` | string | 是 | — | 群组标识;兼容字段,值语义为目标态 `group_aid` |
429
432
  | `page` | integer | 否 | 1 | 页码 |
430
433
  | `size` | integer | 否 | 50 | 每页条数(最大 200) |
431
434
  | `role` | string | 否 | — | 按角色过滤(owner/admin/member) |
@@ -441,9 +444,9 @@
441
444
  "aid": "alice.agentid.pub",
442
445
  "role": "owner",
443
446
  "member_type": "human",
444
- "joined_at": 1234567890,
447
+ "joined_at": 1234567890000,
445
448
  "last_ack_seq": 100,
446
- "last_pull_at": 1234567890
449
+ "last_pull_at": 1234567890000
447
450
  }
448
451
  ],
449
452
  "total": 1,
@@ -461,7 +464,7 @@
461
464
 
462
465
  | 参数 | 类型 | 必填 | 说明 |
463
466
  |------|------|------|------|
464
- | `group_id` | string | 是 | 群组 ID |
467
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
465
468
  | `aid` | string | 是 | 要踢出的 AID |
466
469
 
467
470
  **响应**:
@@ -477,7 +480,7 @@
477
480
 
478
481
  主动退出群组。owner 不能直接退群,需先转让群主。
479
482
 
480
- **参数**:`group_id` (string, 必填)
483
+ **参数**:`group_id`(string,必填;兼容字段,值使用目标态 `group_aid`)
481
484
 
482
485
  **响应**:
483
486
 
@@ -496,7 +499,7 @@
496
499
 
497
500
  | 参数 | 类型 | 必填 | 说明 |
498
501
  |------|------|------|------|
499
- | `group_id` | string | 是 | 群组 ID |
502
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
500
503
  | `aid` | string | 是 | 目标 AID |
501
504
  | `role` | string | 是 | `"admin"` / `"member"` |
502
505
 
@@ -510,7 +513,7 @@
510
513
  "aid": "bob.agentid.pub",
511
514
  "role": "admin",
512
515
  "member_type": "human",
513
- "joined_at": 1234567890,
516
+ "joined_at": 1234567890000,
514
517
  "last_ack_seq": 0,
515
518
  "last_pull_at": 0
516
519
  },
@@ -529,7 +532,7 @@
529
532
 
530
533
  | 参数 | 类型 | 必填 | 说明 |
531
534
  |------|------|------|------|
532
- | `group_id` | string | 是 | 群组 ID |
535
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
533
536
  | `new_owner` | string | 是 | 新群主 AID(也接受 `aid`) |
534
537
 
535
538
  **响应**:
@@ -555,7 +558,7 @@
555
558
 
556
559
  | 参数 | 类型 | 必填 | 说明 |
557
560
  |------|------|------|------|
558
- | `group_id` | string | 是 | 群组 ID |
561
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
559
562
  | `public_key` | string | 是 | 公钥 DER base64(SPKI 格式) |
560
563
  | `curve` | string | 否 | 曲线名称(默认 P-256) |
561
564
 
@@ -564,7 +567,7 @@
564
567
  ```json
565
568
  {
566
569
  "group": {
567
- "group_id": "my-team",
570
+ "group_id": "my-team.agentid.pub",
568
571
  "group_aid": "my-team.agentid.pub",
569
572
  ...
570
573
  },
@@ -599,7 +602,7 @@
599
602
 
600
603
  | 参数 | 类型 | 必填 | 说明 |
601
604
  |------|------|------|------|
602
- | `group_id` | string | 是 | 群组 ID |
605
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
603
606
  | `group_aid` | string | 否 | 群身份 AID(可选,服务端可推导) |
604
607
  | `old_public_key` | string | 是 | 旧公钥 DER base64 |
605
608
  | `new_public_key` | string | 是 | 新公钥 DER base64 |
@@ -629,7 +632,7 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
629
632
  ```json
630
633
  {
631
634
  "group": {
632
- "group_id": "my-team",
635
+ "group_id": "my-team.agentid.pub",
633
636
  "group_aid": "my-team.agentid.pub",
634
637
  ...
635
638
  },
@@ -657,7 +660,7 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
657
660
 
658
661
  | 参数 | 类型 | 必填 | 说明 |
659
662
  |------|------|------|------|
660
- | `group_id` | string | 是 | 群组 ID |
663
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
661
664
  | `subject` | string | 是 | 要封禁的 AID(也接受 `aid`) |
662
665
  | `reason` | string | 否 | 封禁原因 |
663
666
  | `expires_at` | integer | 否 | 过期时间戳(0 = 永久) |
@@ -674,7 +677,7 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
674
677
  "banned_by": "alice.agentid.pub",
675
678
  "reason": "垃圾消息",
676
679
  "expires_at": 0,
677
- "created_at": 1234567890
680
+ "created_at": 1234567890000
678
681
  }
679
682
  }
680
683
  ```
@@ -683,7 +686,7 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
683
686
 
684
687
  解除封禁。需要 **admin 及以上**权限。
685
688
 
686
- **参数**:`group_id` (string), `subject` 或 `aid` (string)
689
+ **参数**:`group_id`(string,兼容字段,值使用目标态 `group_aid`),`subject` 或 `aid` (string)
687
690
 
688
691
  **响应**:
689
692
 
@@ -699,7 +702,7 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
699
702
 
700
703
  获取封禁列表。需要 **admin 及以上**权限。
701
704
 
702
- **参数**:`group_id` (string, 必填)
705
+ **参数**:`group_id`(string,必填;兼容字段,值使用目标态 `group_aid`)
703
706
 
704
707
  **响应**:
705
708
 
@@ -713,7 +716,7 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
713
716
  "banned_by": "alice.agentid.pub",
714
717
  "reason": "垃圾消息",
715
718
  "expires_at": 0,
716
- "created_at": 1234567890
719
+ "created_at": 1234567890000
717
720
  }
718
721
  ],
719
722
  "total": 1,
@@ -734,7 +737,7 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
734
737
 
735
738
  | 参数 | 类型 | 必填 | 说明 |
736
739
  |------|------|------|------|
737
- | `group_id` | string | 是 | 群组 ID |
740
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
738
741
  | `message` | string | 否 | 申请留言 |
739
742
  | `answer` | string | 否 | 入群问题的答案 |
740
743
 
@@ -770,8 +773,8 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
770
773
  "message": "请加我",
771
774
  "answer": "...",
772
775
  "status": "pending",
773
- "created_at": 1234567890,
774
- "updated_at": 1234567890,
776
+ "created_at": 1234567890000,
777
+ "updated_at": 1234567890000,
775
778
  "expires_at": 1234654290,
776
779
  "reviewed_by": null,
777
780
  "rejection_reason": null
@@ -787,7 +790,7 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
787
790
 
788
791
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
789
792
  |------|------|------|--------|------|
790
- | `group_id` | string | 是 | — | 群组 ID |
793
+ | `group_id` | string | 是 | — | 群组标识;兼容字段,值语义为目标态 `group_aid` |
791
794
  | `status` | string | 否 | `"pending"` | `"pending"` / `"approved"` / `"rejected"` |
792
795
  | `page` | integer | 否 | 1 | 页码 |
793
796
  | `size` | integer | 否 | — | 每页数量 |
@@ -803,8 +806,8 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
803
806
  "aid": "carol.agentid.pub",
804
807
  "message": "请加我",
805
808
  "status": "pending",
806
- "created_at": 1234567890,
807
- "updated_at": 1234567890
809
+ "created_at": 1234567890000,
810
+ "updated_at": 1234567890000
808
811
  }
809
812
  ],
810
813
  "total": 1,
@@ -821,7 +824,7 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
821
824
 
822
825
  | 参数 | 类型 | 必填 | 说明 |
823
826
  |------|------|------|------|
824
- | `group_id` | string | 是 | 群组 ID |
827
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
825
828
  | `aid` | string | 是 | 申请人 AID |
826
829
  | `approve` | boolean | 否 | 批准或拒绝,默认 `true` |
827
830
  | `reason` | string | 否 | 拒绝原因 |
@@ -859,7 +862,7 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
859
862
 
860
863
  | 参数 | 类型 | 必填 | 说明 |
861
864
  |------|------|------|------|
862
- | `group_id` | string | 是 | 群组 ID |
865
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
863
866
  | `requests` | array | 是 | 审批列表 |
864
867
 
865
868
  `requests` 数组每项:
@@ -891,7 +894,7 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
891
894
 
892
895
  | 参数 | 类型 | 必填 | 说明 |
893
896
  |------|------|------|------|
894
- | `group_id` | string | 是 | 群组 ID |
897
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
895
898
  | `code` | string | 否 | 自定义邀请码(不提供则自动生成) |
896
899
  | `max_uses` | integer | 否 | 最大使用次数,默认 1,必须 > 0 |
897
900
  | `expires_in_seconds` | integer | 否 | 有效期(秒),默认由 invite_code_ttl_days 配置(7 天) |
@@ -909,7 +912,7 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
909
912
  "max_uses": 10,
910
913
  "used_count": 0,
911
914
  "status": "active",
912
- "created_at": 1234567890
915
+ "created_at": 1234567890000
913
916
  }
914
917
  }
915
918
  ```
@@ -934,13 +937,13 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
934
937
 
935
938
  列出群组的邀请码。需要 admin 权限。
936
939
 
937
- **参数**:`group_id` (string, 必填)
940
+ **参数**:`group_id`(string,必填;兼容字段,值使用目标态 `group_aid`)
938
941
 
939
942
  ### group.revoke_invite_code
940
943
 
941
944
  撤销邀请码。需要 admin 权限。
942
945
 
943
- **参数**:`group_id` (string), `code` (string)
946
+ **参数**:`group_id`(string,兼容字段,值使用目标态 `group_aid`),`code` (string)
944
947
 
945
948
  ---
946
949
 
@@ -948,7 +951,9 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
948
951
 
949
952
  ### group.set_settings
950
953
 
951
- 统一写入群参数。需要 admin 及以上权限。`dispatch_mode` 是群消息的应用层分发模式标签,会随 `group.send` 生成的消息持久化,并由 SDK 在解密后注入到消息顶层和 `payload.dispatch_mode`。
954
+ 统一写入群参数。需要 admin 及以上权限。`dispatch_mode` 是群消息的应用层分发模式标签,会随 `group.send` 生成的消息持久化,并由 SDK 在解密后注入到消息顶层和 `payload.dispatch_mode`。
955
+
956
+ `group.index` 是保留设置 key,用于保存 owner/admin SDK 生成并签名的群索引。更新 indexed settings 时必须同包提交新的签名 `group.index`,并通过 `expected_index_etag` 做 CAS。
952
957
 
953
958
  `dispatch_mode` 不是 `group.send` 的单次入参;要修改后续消息的模式,请通过 `group.set_settings` 更新群设置。
954
959
 
@@ -956,11 +961,13 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
956
961
 
957
962
  | 参数 | 类型 | 必填 | 说明 |
958
963
  |------|------|------|------|
959
- | `group_id` | string | 是 | 群组 ID |
960
- | `settings` | object | 是 | 要写入的设置键值 |
961
- | `settings["dispatch_mode"]` | string | | `"broadcast"` / `"mention"`,默认 `"broadcast"` |
962
- | `settings["rules.content"]` | string | 否 | 群规则正文 |
963
- | `settings["announcement.content"]` | string | 否 | 群公告正文 |
964
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
965
+ | `settings` | object | 是 | 要写入的设置键值 |
966
+ | `expected_index_etag` | string | `group.index` 时必填 | CAS 期望旧 etag;空字符串表示只允许创建首个 `group.index` |
967
+ | `settings["dispatch_mode"]` | string | 否 | `"broadcast"` / `"mention"`,默认 `"broadcast"` |
968
+ | `settings["rules.content"]` | string | 否 | 群规则正文 |
969
+ | `settings["announcement.content"]` | string | 否 | 群公告正文 |
970
+ | `settings["group.index"]` | object | 更新 indexed settings 时必填 | 签名 group index,当前结构至少包含 `body` |
964
971
 
965
972
  **预定义群级参数**:
966
973
 
@@ -976,11 +983,28 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
976
983
  | `join.mode` | string | 按 `visibility` 推导:`public -> open`,`private -> approval` | 入群模式:`"open"` / `"approval"` / `"invite_only"` / `"closed"` |
977
984
  | `join.question` | string | `""` | 入群问题 |
978
985
  | `join.auto_approve_patterns` | array | `[]` | 自动批准 AID 匹配规则 |
979
- | `join.max_pending` | integer | `100` | 最大待审批入群申请数 |
980
- | `dispatch_mode` | string | `"broadcast"` | 群消息分发标签:`"broadcast"` / `"mention"`;未显式设置时 `get_settings` 仍返回默认值 |
981
-
982
- ```python
983
- await client.call("group.set_settings", {
986
+ | `join.max_pending` | integer | `100` | 最大待审批入群申请数 |
987
+ | `dispatch_mode` | string | `"broadcast"` | 群消息分发标签:`"broadcast"` / `"mention"`;未显式设置时 `get_settings` 仍返回默认值 |
988
+ | `group.index` | object | — | 保留 key;签名 JSONL 群索引,由 SDK 生成,服务端只校验、CAS 保存和返回 |
989
+
990
+ **indexed settings**:
991
+
992
+ | key | 说明 |
993
+ |-----|------|
994
+ | `rules.content` / `rules.attachments` | 群规则正文与附件稳定引用 |
995
+ | `announcement.content` / `announcement.attachments` | 群公告正文与附件稳定引用 |
996
+ | `join.mode` / `join.question` / `join.auto_approve_patterns` / `join.max_pending` | 入群要求配置 |
997
+
998
+ 写入规则:
999
+
1000
+ - 只更新非 indexed settings 时,继续直接调用 `set_settings`,不需要 `group.index`。
1001
+ - 更新任意 indexed setting 时,必须在同一次 `settings` 中携带签名 `group.index`。
1002
+ - 写入 `group.index` 时必须传 `expected_index_etag`。
1003
+ - 服务端在同一事务内比较当前 `group.index` etag、写 indexed settings、写 `group.index`。
1004
+ - CAS 失败时错误消息包含 `group.index etag conflict`;SDK 的 `updateGroupIndex` 会重新读取当前 index、重建签名并按 `max_attempts` 重试。
1005
+
1006
+ ```python
1007
+ await client.call("group.set_settings", {
984
1008
  "group_id": "g-abc123.agentid.pub",
985
1009
  "settings": {"dispatch_mode": "mention"},
986
1010
  })
@@ -989,33 +1013,86 @@ await client.call("group.set_settings", {
989
1013
  **响应**:
990
1014
 
991
1015
  ```json
992
- {
993
- "group_id": "g-abc123.agentid.pub",
994
- "updated_keys": ["dispatch_mode"]
995
- }
996
- ```
997
-
998
- ### group.get_settings
999
-
1000
- 统一读取群参数。成员可读;不传 `keys` 时返回核心群资料和 settings 表中的全部设置。未显式设置 `dispatch_mode` 时,服务端仍返回默认值 `"broadcast"`。
1016
+ {
1017
+ "group_id": "g-abc123.agentid.pub",
1018
+ "group_aid": "g-abc123.agentid.pub",
1019
+ "updated_keys": ["dispatch_mode"]
1020
+ }
1021
+ ```
1022
+
1023
+ 写入 `group.index` 成功时,响应顶层会强制携带 `_meta.group_indexes`:
1024
+
1025
+ ```json
1026
+ {
1027
+ "group_id": "g-abc123.agentid.pub",
1028
+ "group_aid": "g-abc123.agentid.pub",
1029
+ "updated_keys": ["announcement.content", "group.index"],
1030
+ "_meta": {
1031
+ "group_indexes": {
1032
+ "g-abc123.agentid.pub": {
1033
+ "etag": "\"sha256:...\"",
1034
+ "last_modified": 1780000000000,
1035
+ "schema": "aun.group.index.v1"
1036
+ }
1037
+ }
1038
+ }
1039
+ }
1040
+ ```
1041
+
1042
+ `group.index` 的正文格式:
1043
+
1044
+ ```jsonl
1045
+ {"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..."}
1046
+ {"key":"announcement.content","source":"db","etag":"\"sha256:...\"","last_modified":1780000000000}
1047
+ ```
1048
+
1049
+ `etag` 和 `body_hash` 都由 index 条目的 canonical JSONL bytes 计算。`signature` 覆盖去掉 `signature` 字段后的 `index_meta` 和正文条目,`signed_by` 必须等于本次 RPC actor AID。服务端不会根据 DB 状态生成 `group.index`。
1050
+
1051
+ ### group.get_settings
1052
+
1053
+ 统一读取群参数。成员可读;不传 `keys` 时返回核心群资料和 settings 表中的全部设置。未显式设置 `dispatch_mode` 时,服务端仍返回默认值 `"broadcast"`。读取 `keys=["group.index"]` 可从服务端摘取当前签名 `group.index`。
1001
1054
 
1002
1055
  **参数**:
1003
1056
 
1004
1057
  | 参数 | 类型 | 必填 | 说明 |
1005
1058
  |------|------|------|------|
1006
- | `group_id` | string | 是 | 群组 ID |
1007
- | `keys` | array | 否 | 只读取指定 key,如 `["dispatch_mode", "rules.content"]` |
1059
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1060
+ | `keys` | array | 否 | 只读取指定 key,如 `["dispatch_mode", "rules.content"]`;读取 `["group.index"]` 时强制返回 `_meta.group_indexes` |
1008
1061
 
1009
1062
  **响应**:
1010
1063
 
1011
1064
  ```json
1012
- {
1013
- "group_id": "g-abc123.agentid.pub",
1014
- "settings": [
1015
- {"key": "dispatch_mode", "value": "broadcast", "updated_at": 1234567890000}
1016
- ]
1017
- }
1018
- ```
1065
+ {
1066
+ "group_id": "g-abc123.agentid.pub",
1067
+ "group_aid": "g-abc123.agentid.pub",
1068
+ "settings": [
1069
+ {"key": "dispatch_mode", "value": "broadcast", "updated_at": 1234567890000}
1070
+ ]
1071
+ }
1072
+ ```
1073
+
1074
+ 如果服务端已保存 `group.index`,普通 settings 读取可能在顶层返回 `_meta.group_indexes`。该 meta 受服务端注入频率控制;显式读取 `group.index` 时会强制返回:
1075
+
1076
+ ```json
1077
+ {
1078
+ "group_id": "g-abc123.agentid.pub",
1079
+ "group_aid": "g-abc123.agentid.pub",
1080
+ "settings": [
1081
+ {"key": "group.index", "value": {"body": "..."}, "updated_by": "alice.agentid.pub", "updated_at": 1780000000000}
1082
+ ],
1083
+ "_meta": {
1084
+ "group_indexes": {
1085
+ "g-abc123.agentid.pub": {
1086
+ "etag": "\"sha256:...\"",
1087
+ "last_modified": 1780000000000,
1088
+ "schema": "aun.group.index.v1"
1089
+ }
1090
+ }
1091
+ }
1092
+ }
1093
+ ```
1094
+
1095
+ SDK 观察到 `_meta.group_indexes` 只记录远端 etag,不会自动覆盖本地 index 或业务缓存。etag 不一致只表示本地与观察到的远端版本不同,方向由应用层决定:`checkGroupIndex` 用于检查是否不同步,`getGroupIndex` 用于显式 pull 远端 manifest 并同步本地缓存,`updateGroupIndex` 用于显式 CAS push 本地 indexed settings。
1019
1096
 
1020
1097
  ## 消息
1021
1098
 
@@ -1029,7 +1106,7 @@ await client.call("group.set_settings", {
1029
1106
 
1030
1107
  | 参数 | 类型 | 必填 | 说明 |
1031
1108
  |------|------|------|------|
1032
- | `group_id` | string | 是 | 群组 ID |
1109
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1033
1110
  | `payload` | object | 否 | 消息内容 |
1034
1111
  | `type` | string | 否 | 信封/封装类型,普通业务消息无需填写;SDK 加密群消息时自动使用 `e2ee.group_encrypted` |
1035
1112
  | `attachments` | array | 否 | 兼容旧接口的顶层附件元数据;推荐把业务附件放入 `payload.attachments` |
@@ -1037,7 +1114,7 @@ await client.call("group.set_settings", {
1037
1114
 
1038
1115
  ### Payload 参考约定
1039
1116
 
1040
- `group.send.params.payload` 的统一业务负载格式见 [09-payload-reference](09-payload-reference.md)。完整群消息请求仍在 `payload` 同级传入 `group_id`;业务类型放在 `payload.type`,不要与 `group.send.params.type` 信封/封装类型混用。
1117
+ `group.send.params.payload` 的统一业务负载格式见 [09-payload-reference](09-payload-reference.md)。完整群消息请求仍在 `payload` 同级传入 `group_id`(兼容参数名,值使用目标态 `group_aid`);业务类型放在 `payload.type`,不要与 `group.send.params.type` 信封/封装类型混用。
1041
1118
 
1042
1119
  `protected_headers` 只在 SDK 加密路径生效;裸 RPC 发送明文或已加密信封时,调用方需自行遵守 [05-E2EE加密通信](05-E2EE加密通信.md#protectedheaders-与可验证上下文) 的格式和校验规则。
1043
1120
 
@@ -1059,34 +1136,45 @@ await client.call("group.set_settings", {
1059
1136
  },
1060
1137
  "event": { ... },
1061
1138
  "dispatch_mode": "broadcast",
1062
- "dispatch": {"mode": "broadcast", "reason": "duty_disabled"},
1063
- "message_dispatch": { ... }
1064
- }
1065
- ```
1139
+ "dispatch": {"mode": "broadcast", "reason": "duty_disabled"},
1140
+ "message_dispatch": { ... },
1141
+ "envelope": {
1142
+ "from": "alice.agentid.pub",
1143
+ "group_id": "g-abc123.agentid.pub",
1144
+ "type": "text",
1145
+ "timestamp": 1234567890000,
1146
+ "encrypted": true,
1147
+ "payload_type": "text"
1148
+ },
1149
+ "payload": {"type": "text", "text": "Hello"}
1150
+ }
1151
+ ```
1066
1152
 
1067
1153
  | 字段 | 类型 | 说明 |
1068
1154
  |------|------|------|
1069
- | `group_id` | string | 群组 ID |
1155
+ | `group_id` | string | 兼容字段,值语义为目标态 `group_aid` |
1070
1156
  | `message` | object | 消息对象(含 seq、message_id、sender_aid 等) |
1071
1157
  | `event` | object | 关联的群事件对象 |
1072
1158
  | `dispatch_mode` | string | 群消息持久化分发模式标签:`"broadcast"` / `"mention"`;SDK 解密后也会注入到 `payload.dispatch_mode` |
1073
- | `dispatch` | object | 分发策略:`mode` 为 `"broadcast"`(广播全员)或 `"duty"`(值班分发);`reason` 说明原因(如 `"duty_disabled"` / `"active_duty"` / `"no_duty_candidate"` 等) |
1074
- | `duty_state` | object | 可选,值班模式下的当前状态 |
1075
- | `message_dispatch` | object | 运行时分发结果;常见 `status` 包括 `"broadcast"`、`"sent"`、`"queued_batch"`、`"debounced"`、`"skipped"`、`"failed"` |
1159
+ | `dispatch` | object | 分发策略:`mode` 为 `"broadcast"`(广播全员)或 `"duty"`(值班分发);`reason` 说明原因(如 `"duty_disabled"` / `"active_duty"` / `"no_duty_candidate"` 等) |
1160
+ | `duty_state` | object | 可选,值班模式下的当前状态 |
1161
+ | `message_dispatch` | object | 运行时分发结果;常见 `status` 包括 `"broadcast"`、`"sent"`、`"queued_batch"`、`"debounced"`、`"skipped"`、`"failed"` |
1162
+ | `envelope` | object | SDK 回填的发送结果信封,包含发送方、群标识、业务类型、时间戳、加密标志、protected headers 等可转发元数据 |
1163
+ | `payload` | object | SDK 回填的应用层业务 payload;裸 RPC 或内部 `_skip_send_result_envelope` 路径可能没有该字段 |
1076
1164
 
1077
1165
  ### group.thought.put
1078
1166
 
1079
1167
  写入某个发送者针对一个群上下文的思考内容。该内容不是普通群消息:服务端不分配消息 `seq`,不广播,不进入 `group.pull`,不需要 ack,也不持久化;只在内存中保留当前 head。
1080
1168
 
1081
- SDK 调用时必须走群组 E2EE。应用层传入明文 `payload`,SDK 会加密成 `e2ee.group_encrypted` 信封、补齐 `thought_id` / `timestamp`,并附加 `client_signature`。裸 WebSocket 客户端若绕过 SDK,则必须自行完成同等加密和签名。
1169
+ SDK 调用时必须走群组 E2EE。应用层传入明文 `payload`,SDK 会加密成 V2 `e2ee.group_encrypted` 信封、补齐 `thought_id` / `timestamp`,并附加 `client_signature`。裸 WebSocket 客户端若绕过 SDK,至少必须自行完成 V2 envelope、`sender_signature`、AAD 和 state commitment 生成;`client_signature` 按 Gateway 连接级身份语义携带。
1082
1170
 
1083
- 存储键为 `group_id + sender_aid + context.type + context.id`。其中 `sender_aid` 由服务端认证态派生,不能由客户端指定;`context` 是 thought head 的唯一 selector,推荐使用 `{"type": "run", "id": "run-xxx"}`。同一 `(group_id, sender_aid)` 保留最近 N 个 context 对应的 head,N 由群服务配置 `max_thought_heads_per_sender` 控制,当前默认值为 5;同一个 head 下可追加多条 thought item。
1171
+ 存储键为规范化后的 `group_aid + sender_aid + context.type + context.id`。RPC 字段名仍为 `group_id` 以兼容旧客户端,但服务端会先规范化为目标态群标识;`sender_aid` 由服务端认证态派生,不能由客户端指定;`context` 是 thought head 的唯一 selector,推荐使用 `{"type": "run", "id": "run-xxx"}`。同一 `(group_aid, sender_aid)` 保留最近 N 个 context 对应的 head,N 由群服务配置 `max_thought_heads_per_sender` 控制,当前默认值为 100;同一个 head 下可追加多条 thought item。
1084
1172
 
1085
1173
  **参数**:
1086
1174
 
1087
1175
  | 参数 | 类型 | 必填 | 说明 |
1088
1176
  |------|------|------|------|
1089
- | `group_id` | string | 是 | 群组 ID |
1177
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1090
1178
  | `context.type` | string | 是 | 思考的上下文类型,推荐 `run` |
1091
1179
  | `context.id` | string | 是 | 思考的上下文 ID,如 `run_id` |
1092
1180
  | `payload` | object | 是 | SDK 加密前的思考内容;推荐格式见 [09-payload-reference](09-payload-reference.md#thought思考内容) |
@@ -1114,7 +1202,7 @@ await client.call("group.thought.put", {
1114
1202
  "thought_id": "gt-...",
1115
1203
  "type": "e2ee.group_encrypted",
1116
1204
  "encrypted": true,
1117
- "payload": {"type": "e2ee.group_encrypted", "...": "..."},
1205
+ "payload": {"type": "e2ee.group_encrypted", "version": "v2", "...": "..."},
1118
1206
  "client_signature": { "...": "..." }
1119
1207
  }
1120
1208
  ```
@@ -1140,7 +1228,7 @@ await client.call("group.thought.put", {
1140
1228
 
1141
1229
  | 参数 | 类型 | 必填 | 说明 |
1142
1230
  |------|------|------|------|
1143
- | `group_id` | string | 是 | 群组 ID |
1231
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1144
1232
  | `sender_aid` | string | 是 | thought 作者 AID |
1145
1233
  | `context.type` | string | 是 | 思考的上下文类型,推荐 `run` |
1146
1234
  | `context.id` | string | 是 | 思考的上下文 ID,如 `run_id` |
@@ -1189,9 +1277,9 @@ result = await client.call("group.thought.get", {
1189
1277
 
1190
1278
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
1191
1279
  |------|------|------|--------|------|
1192
- | `group_id` | string | 是 | — | 群组 ID |
1280
+ | `group_id` | string | 是 | — | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1193
1281
  | `after_message_seq` | integer | 否 | 0 | 从该消息 seq 之后拉取 |
1194
- | `limit` | integer | 否 | 100 | 最大条数 |
1282
+ | `limit` | integer | 否 | 50 | 最大条数(最大 50;`pull_max_limit` 配置只能进一步收紧) |
1195
1283
  | `device_id` | string | 否 | — | 设备 ID(多设备模式) |
1196
1284
 
1197
1285
  **响应**:
@@ -1202,7 +1290,7 @@ result = await client.call("group.thought.get", {
1202
1290
  "messages": [ ... ],
1203
1291
  "latest_message_seq": 42,
1204
1292
  "has_more": false,
1205
- "limit": 100
1293
+ "limit": 50
1206
1294
  }
1207
1295
  ```
1208
1296
 
@@ -1218,7 +1306,7 @@ result = await client.call("group.thought.get", {
1218
1306
 
1219
1307
  | 参数 | 类型 | 必填 | 说明 |
1220
1308
  |------|------|------|------|
1221
- | `group_id` | string | 是 | 群组 ID |
1309
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1222
1310
  | `device_id` | string | 是 | 设备 ID |
1223
1311
  | `msg_seq` | integer | 是 | 确认到的消息序号 |
1224
1312
 
@@ -1243,7 +1331,7 @@ result = await client.call("group.thought.get", {
1243
1331
 
1244
1332
  | 参数 | 类型 | 必填 | 说明 |
1245
1333
  |------|------|------|------|
1246
- | `group_id` | string | 是 | 群组 ID |
1334
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1247
1335
  | `message_ids` | string[] | 是 | 待撤回消息 ID 列表,最多 100 个(`recall_max_batch`)|
1248
1336
  | `reason` | string | 否 | 可选撤回理由,建议短文本(最长 255 字符)|
1249
1337
 
@@ -1392,7 +1480,7 @@ result = await client.call("group.thought.get", {
1392
1480
 
1393
1481
  获取当前在线成员列表。
1394
1482
 
1395
- **参数**:`group_id` (string, 必填)
1483
+ **参数**:`group_id`(string,必填;兼容字段,值使用目标态 `group_aid`)
1396
1484
 
1397
1485
  **响应**:
1398
1486
 
@@ -1407,10 +1495,10 @@ result = await client.call("group.thought.get", {
1407
1495
  {
1408
1496
  "aid": "alice.agentid.pub",
1409
1497
  "role": "owner",
1410
- "joined_at": 1234567890,
1498
+ "joined_at": 1234567890000,
1411
1499
  "online": true,
1412
1500
  "session_id": "sess_123",
1413
- "last_active_at": 1234567890,
1501
+ "last_active_at": 1234567890000,
1414
1502
  "expire_at": 1234571490
1415
1503
  }
1416
1504
  ]
@@ -1431,12 +1519,12 @@ result = await client.call("group.thought.get", {
1431
1519
 
1432
1520
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
1433
1521
  |------|------|------|--------|------|
1434
- | `group_id` | string | 是 | — | 群组 ID |
1522
+ | `group_id` | string | 是 | — | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1435
1523
  | `device_id` | string | 否 | — | 设备 ID,多设备模式必填 |
1436
1524
  | `device_name` | string | 否 | — | 设备名称(首次注册时使用) |
1437
1525
  | `device_type` | string | 否 | — | 设备类型 |
1438
1526
  | `after_event_seq` | integer | 否 | 游标位置 | 从该事件 seq 之后拉取;多设备模式下默认使用设备游标 |
1439
- | `limit` | integer | 否 | 100 | 最大条数(受 `pull_max_limit` 配置限制) |
1527
+ | `limit` | integer | 否 | 50 | 最大条数(最大 50;`pull_max_limit` 配置只能进一步收紧) |
1440
1528
 
1441
1529
  **响应**:
1442
1530
 
@@ -1446,7 +1534,7 @@ result = await client.call("group.thought.get", {
1446
1534
  "events": [ ... ],
1447
1535
  "latest_event_seq": 100,
1448
1536
  "has_more": false,
1449
- "limit": 100,
1537
+ "limit": 50,
1450
1538
  "cursor": {
1451
1539
  "current_seq": 50,
1452
1540
  "join_seq": 0,
@@ -1466,7 +1554,7 @@ result = await client.call("group.thought.get", {
1466
1554
 
1467
1555
  | 参数 | 类型 | 必填 | 说明 |
1468
1556
  |------|------|------|------|
1469
- | `group_id` | string | 是 | 群组 ID |
1557
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1470
1558
  | `device_id` | string | 是 | 设备 ID |
1471
1559
  | `msg_seq` | integer | 是 | 确认到的消息序号 |
1472
1560
 
@@ -1482,7 +1570,7 @@ result = await client.call("group.thought.get", {
1482
1570
 
1483
1571
  | 参数 | 类型 | 必填 | 说明 |
1484
1572
  |------|------|------|------|
1485
- | `group_id` | string | 是 | 群组 ID |
1573
+ | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1486
1574
  | `device_id` | string | 是 | 设备 ID |
1487
1575
  | `event_seq` | integer | 是 | 确认到的事件序号 |
1488
1576
 
@@ -1492,7 +1580,7 @@ result = await client.call("group.thought.get", {
1492
1580
 
1493
1581
  列出当前用户在指定群组的所有设备及游标状态。
1494
1582
 
1495
- **参数**:`group_id` (必填)
1583
+ **参数**:`group_id`(必填;兼容字段,值使用目标态 `group_aid`)
1496
1584
 
1497
1585
  **响应**:
1498
1586
 
@@ -1515,7 +1603,7 @@ result = await client.call("group.thought.get", {
1515
1603
 
1516
1604
  注销设备游标(清理不再使用的设备记录)。
1517
1605
 
1518
- **参数**:`group_id` (必填), `device_id` (必填)
1606
+ **参数**:`group_id`(必填;兼容字段,值使用目标态 `group_aid`),`device_id` (必填)
1519
1607
 
1520
1608
  **响应**:`{ "success": true }`
1521
1609
 
@@ -1527,7 +1615,7 @@ result = await client.call("group.thought.get", {
1527
1615
 
1528
1616
  获取管理员列表(owner + admin 角色)。
1529
1617
 
1530
- **参数**:`group_id` (必填)
1618
+ **参数**:`group_id`(必填;兼容字段,值使用目标态 `group_aid`)
1531
1619
 
1532
1620
  **响应**:
1533
1621
 
@@ -1538,7 +1626,7 @@ result = await client.call("group.thought.get", {
1538
1626
  "aid": "alice.agentid.pub",
1539
1627
  "role": "owner",
1540
1628
  "member_type": "human",
1541
- "joined_at": 1234567890
1629
+ "joined_at": 1234567890000
1542
1630
  }
1543
1631
  ]
1544
1632
  }
@@ -1548,7 +1636,7 @@ result = await client.call("group.thought.get", {
1548
1636
 
1549
1637
  获取群主 AID。
1550
1638
 
1551
- **参数**:`group_id` (必填)
1639
+ **参数**:`group_id`(必填;兼容字段,值使用目标态 `group_aid`)
1552
1640
 
1553
1641
  **响应**:`{ "group_id": "g-abc123.agentid.pub", "owner_aid": "alice.agentid.pub" }`
1554
1642
 
@@ -1556,7 +1644,7 @@ result = await client.call("group.thought.get", {
1556
1644
 
1557
1645
  获取群组综合统计摘要。
1558
1646
 
1559
- **参数**:`group_id` (必填)
1647
+ **参数**:`group_id`(必填;兼容字段,值使用目标态 `group_aid`)
1560
1648
 
1561
1649
  **响应**:
1562
1650
 
@@ -1575,8 +1663,8 @@ result = await client.call("group.thought.get", {
1575
1663
  "message_seq": 1000,
1576
1664
  "event_seq": 2000,
1577
1665
  "e2ee_epoch": 3,
1578
- "created_at": 1234567890,
1579
- "updated_at": 1234567890
1666
+ "created_at": 1234567890000,
1667
+ "updated_at": 1234567890000
1580
1668
  }
1581
1669
  ```
1582
1670
 
@@ -1585,7 +1673,7 @@ result = await client.call("group.thought.get", {
1585
1673
 
1586
1674
  刷新成员类型分类统计。
1587
1675
 
1588
- **参数**:`group_id` (必填)
1676
+ **参数**:`group_id`(必填;兼容字段,值使用目标态 `group_aid`)
1589
1677
 
1590
1678
  **响应**:
1591
1679
 
@@ -1641,14 +1729,14 @@ result = await client.call("group.thought.get", {
1641
1729
  }
1642
1730
  ```
1643
1731
 
1644
- SDK 交付给应用层的群事件信封字段统一放在 `envelope`。0.4.x 兼容期仍保留顶层 `module_id` / `action` / `group_id` / `event_seq` 等别名,下一个大版本 0.5.* 将移除这些顶层别名,请通过 `ev["envelope"]["action"]` 等路径访问。
1732
+ SDK 交付给应用层的群事件信封字段统一放在 `envelope`。0.5.x 当前仍保留顶层 `module_id` / `action` / `group_id` / `event_seq` 等兼容别名;新代码应优先通过 `ev["envelope"]["action"]` 等路径访问。
1645
1733
 
1646
1734
  | 字段 | 类型 | 说明 |
1647
1735
  |------|------|------|
1648
1736
  | `envelope` | object | 群事件信封,包含 `module_id`、`action`、`group_id`、`event_seq`、`event_type`、`actor_aid`、`created_at`、`device_id`、`slot_id` 等存在的字段 |
1649
1737
  | `module_id` | string | 固定 `"group"` |
1650
1738
  | `action` | string | 变更类型(见下表) |
1651
- | `group_id` | string | 群组 ID |
1739
+ | `group_id` | string | 兼容字段,值语义为目标态 `group_aid` |
1652
1740
  | `event_seq` | integer | 可选,服务端分配的单调递增序号,用于 SDK 内部保序去重 |
1653
1741
  | `path` | string | 可选,Group FS 相关 action 的节点路径 |
1654
1742
 
@@ -1686,12 +1774,9 @@ SDK 交付给应用层的群事件信封字段统一放在 `envelope`。0.4.x
1686
1774
  | `invite_code_revoked` | 邀请码撤销 |
1687
1775
  | `member_banned` | 成员封禁 |
1688
1776
  | `member_unbanned` | 成员解封 |
1689
- | `resource_put` | 资源上传 |
1690
- | `resource_updated` | 资源更新 |
1691
- | `resource_deleted` | 资源删除 |
1692
- | `suspended` | 群组暂停 |
1693
- | `resumed` | 群组恢复 |
1694
- | `dissolved` | 群组解散 |
1777
+ | `suspended` | 群组暂停 |
1778
+ | `resumed` | 群组恢复 |
1779
+ | `dissolved` | 群组解散 |
1695
1780
 
1696
1781
  **订阅**:
1697
1782
 
@@ -1715,11 +1800,21 @@ client.on("group.changed", lambda ev: print(ev["action"]))
1715
1800
  "type": "e2ee.group_encrypted",
1716
1801
  "dispatch_mode": "broadcast",
1717
1802
  "payload": { "type": "e2ee.group_encrypted", "..." : "..." },
1718
- "dispatch": {"mode": "broadcast", "reason": "duty_disabled"},
1719
- "kind": "group.broadcast",
1720
- "member_aids": ["bob.agentid.pub"]
1721
- }
1722
- ```
1803
+ "dispatch": {"mode": "broadcast", "reason": "duty_disabled"},
1804
+ "kind": "group.broadcast",
1805
+ "member_aids": ["bob.agentid.pub"],
1806
+ "proximity": {
1807
+ "same_device": false,
1808
+ "same_egress_ip": true,
1809
+ "same_network": true,
1810
+ "basis": "egress_ip",
1811
+ "asserted_by": "gateway"
1812
+ },
1813
+ "same_device": false,
1814
+ "same_egress_ip": true,
1815
+ "same_network": true
1816
+ }
1817
+ ```
1723
1818
 
1724
1819
  SDK 收到后自动解密 `payload`,解密后的明文消息直接交付用户回调。
1725
1820
 
@@ -1760,7 +1855,7 @@ SDK 收到后自动调用 `group.pull` 拉取最新消息并逐条解密后交
1760
1855
  }
1761
1856
  ```
1762
1857
 
1763
- SDK 交付给应用层的 `payload` 是明文业务 JSON 对象;群消息信封字段统一放在 `envelope`。`envelope` 只保留可转发的归一化元数据,`from` 由 `sender_aid` 归一化而来,`timestamp` 由 `created_at` / `t_server` 归一化而来。0.4.x 兼容期仍保留顶层 `group_id` / `seq` / `message_id` / `sender_aid` / `dispatch_mode` 等别名,下一个大版本 0.5.* 将移除这些顶层别名;请通过 `msg["envelope"]["from"]`、`msg["envelope"]["timestamp"]` 等路径访问。
1858
+ SDK 交付给应用层的 `payload` 是明文业务 JSON 对象;群消息信封字段统一放在 `envelope`。`envelope` 只保留可转发的归一化元数据,`from` 由 `sender_aid` 归一化而来,`timestamp` 由 `created_at` / `t_server` 归一化而来。0.5.x 当前仍保留顶层 `group_id` / `seq` / `message_id` / `sender_aid` / `dispatch_mode` 等兼容别名;新代码应优先通过 `msg["envelope"]["from"]`、`msg["envelope"]["timestamp"]` 等路径访问。Gateway 可能附加 `proximity` 及 `same_device` / `same_egress_ip` / `same_network`,表示由 Gateway 基于连接上下文判断的近端关系提示,不参与 E2EE AAD 或业务鉴权。
1764
1859
 
1765
1860
  ### event/group.message_recalled
1766
1861
 
@@ -1792,13 +1887,13 @@ SDK 交付给应用层的 `payload` 是明文业务 JSON 对象;群消息信
1792
1887
  }
1793
1888
  ```
1794
1889
 
1795
- SDK 交付给应用层的撤回事件同样带 `envelope`。`envelope` 表示当前交付的撤回 tombstone / 通知自身信封,不是被撤回原消息的信封;业务侧被撤回的原消息列表继续使用 `message_ids` / `target_message_seqs`。`message_id` / `seq` 继续只保留在顶层兼容字段中,不进入 `envelope`。0.4.x 兼容期仍保留顶层 `group_id` / `seq` / `message_id` / `sender_aid` 等别名,下一个大版本 0.5.* 将移除这些顶层别名。
1890
+ SDK 交付给应用层的撤回事件同样带 `envelope`。`envelope` 表示当前交付的撤回 tombstone / 通知自身信封,不是被撤回原消息的信封;业务侧被撤回的原消息列表继续使用 `message_ids` / `target_message_seqs`。`message_id` / `seq` 继续只保留在顶层兼容字段中,不进入 `envelope`。0.5.x 当前仍保留顶层 `group_id` / `seq` / `message_id` / `sender_aid` 等兼容别名;新代码应优先读取 `envelope`、`message_ids` 和 `target_message_seqs`。
1796
1891
 
1797
1892
  | 字段 | 类型 | 说明 |
1798
1893
  |------|------|------|
1799
1894
  | `envelope` | object | 撤回 tombstone / 通知自身信封,包含 `group_id`、`from`、`type`、`kind`、`timestamp`、`encrypted`、`context`、`protected_headers` 等存在的字段 |
1800
1895
  | `module_id` | string | 固定 `"group"` |
1801
- | `group_id` | string | 群组 ID |
1896
+ | `group_id` | string | 兼容字段,值语义为目标态 `group_aid` |
1802
1897
  | `seq` | integer | 当前交付的撤回 tombstone / 通知 seq;在线 push 为 notice_seq,原 seq 占位 tombstone 为原消息 seq |
1803
1898
  | `message_id` | string | 当前交付的撤回 tombstone / 通知自己的 message_id |
1804
1899
  | `tombstone_message_id` | string | 兼容别名,等同于撤回 tombstone / 通知自身的 `message_id` |