@agentunion/fastaun-browser 0.5.2 → 0.5.4

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 +74 -0
  2. package/_packed_docs/CHANGELOG.md +74 -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 +303 -28
  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 +126 -42
  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 +1084 -296
  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 +9 -0
  28. package/dist/facades.d.ts.map +1 -1
  29. package/dist/facades.js +314 -77
  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
@@ -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`),并提供通用文档型方法(`getSettingWithIndex`/`updateSettingWithIndex`,Python `get_setting_with_index`/`update_setting_with_index`,Go 为 `GetSettingWithIndex`/`UpdateSettingWithIndex`)。读取方法优先返回 SDK 本地缓存,本地没有对应值时才调用 `get_settings` 初始化;即使观察到远端 etag 不一致也不会自动 pull 远端。indexed 写入方法内部调用 `updateGroupIndex` 生成签名 `group.index` 并通过 `set_settings` CAS 提交。
107
107
 
108
108
  ### 群文件系统
109
109
 
@@ -493,7 +493,7 @@ SDK 发起 `group.*` 调用时会把传入的 `group_id` / `groupId` / `group_ai
493
493
 
494
494
  ### group.set_role
495
495
 
496
- 设置成员角色。需要 **owner** 权限。不能改变 owner 角色。该 RPC 只改变 membership 中的角色事实,不授予或撤销群自有区写 ACL;`role:admin` 是否可写群自有区由 `group.fs.set_acl` / `group.fs.remove_acl` 显式控制。
496
+ 设置成员角色。`owner` 可将普通成员设为 `admin`,也可将 `admin` 设回 `member`;`admin` 不能修改其它成员角色,只能将自己的角色降为 `member`。不能通过 `group.set_role` 改变 `owner` 角色;群主只在建群或 `group.transfer_owner` 中变更。该 RPC 改变 membership 中的角色事实;`owner/admin` 默认拥有群自有区写权限,`member` 默认没有写权限。成员级群协作目录应通过 `group.fs.set_acl` 显式授予 `role:member` 的 `rw` 权限。
497
497
 
498
498
  **参数**:
499
499
 
@@ -951,7 +951,9 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
951
951
 
952
952
  ### group.set_settings
953
953
 
954
- 统一写入群参数。需要 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。
955
957
 
956
958
  `dispatch_mode` 不是 `group.send` 的单次入参;要修改后续消息的模式,请通过 `group.set_settings` 更新群设置。
957
959
 
@@ -960,10 +962,17 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
960
962
  | 参数 | 类型 | 必填 | 说明 |
961
963
  |------|------|------|------|
962
964
  | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
963
- | `settings` | object | 是 | 要写入的设置键值 |
964
- | `settings["dispatch_mode"]` | string | | `"broadcast"` / `"mention"`,默认 `"broadcast"` |
965
- | `settings["rules.content"]` | string | 否 | 群规则正文 |
966
- | `settings["announcement.content"]` | string | 否 | 群公告正文 |
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["rules.attachments"]` | array | 否 | 群规则附件稳定引用 |
970
+ | `settings["announcement.content"]` | string | 否 | 群公告正文 |
971
+ | `settings["announcement.attachments"]` | array | 否 | 群公告附件稳定引用 |
972
+ | `settings["join.attachments"]` | array | 否 | 入群要求附件稳定引用 |
973
+ | `settings["{keyName}.content"]` | string | 否 | 通用文档型 indexed setting 正文;`keyName` 需满足受控命名规则 |
974
+ | `settings["{keyName}.attachments"]` | array | 否 | 通用文档型 indexed setting 附件稳定引用 |
975
+ | `settings["group.index"]` | object | 更新 indexed settings 时必填 | 签名 group index,当前结构至少包含 `body` |
967
976
 
968
977
  **预定义群级参数**:
969
978
 
@@ -977,13 +986,34 @@ aun-group-aid-renew-v1|{group_id}|{group_aid}|{sha256(old_public_key)}|{sha256(n
977
986
  | `announcement.content` | string | `""` | 群公告正文 |
978
987
  | `announcement.attachments` | array | `[]` | 群公告附件 |
979
988
  | `join.mode` | string | 按 `visibility` 推导:`public -> open`,`private -> approval` | 入群模式:`"open"` / `"approval"` / `"invite_only"` / `"closed"` |
980
- | `join.question` | string | `""` | 入群问题 |
981
- | `join.auto_approve_patterns` | array | `[]` | 自动批准 AID 匹配规则 |
982
- | `join.max_pending` | integer | `100` | 最大待审批入群申请数 |
983
- | `dispatch_mode` | string | `"broadcast"` | 群消息分发标签:`"broadcast"` / `"mention"`;未显式设置时 `get_settings` 仍返回默认值 |
984
-
985
- ```python
986
- await client.call("group.set_settings", {
989
+ | `join.question` | string | `""` | 入群问题 |
990
+ | `join.auto_approve_patterns` | array | `[]` | 自动批准 AID 匹配规则 |
991
+ | `join.max_pending` | integer | `100` | 最大待审批入群申请数 |
992
+ | `join.attachments` | array | `[]` | 入群材料附件稳定引用 |
993
+ | `dispatch_mode` | string | `"broadcast"` | 群消息分发标签:`"broadcast"` / `"mention"`;未显式设置时 `get_settings` 仍返回默认值 |
994
+ | `group.index` | object | — | 保留 key;签名 JSONL 群索引,由 SDK 生成,服务端只校验、CAS 保存和返回 |
995
+
996
+ **indexed settings**:
997
+
998
+ | key | 说明 |
999
+ |-----|------|
1000
+ | `rules.content` / `rules.attachments` | 群规则正文与附件稳定引用 |
1001
+ | `announcement.content` / `announcement.attachments` | 群公告正文与附件稳定引用 |
1002
+ | `join.mode` / `join.question` / `join.auto_approve_patterns` / `join.max_pending` / `join.attachments` | 入群要求配置与附件稳定引用 |
1003
+ | `{keyName}.content` / `{keyName}.attachments` | 通用文档型设置正文与附件稳定引用 |
1004
+
1005
+ 写入规则:
1006
+
1007
+ - 只更新非 indexed settings 时,继续直接调用 `set_settings`,不需要 `group.index`。
1008
+ - 更新任意 indexed setting 时,必须在同一次 `settings` 中携带签名 `group.index`。
1009
+ - 服务端只接受受控动态文档 key:`{keyName}.content` / `{keyName}.attachments`,其中 `keyName` 匹配 `^[A-Za-z][A-Za-z0-9_-]{0,63}$`,且不能使用 `join` 等保留前缀。调用方不能用该机制写任意 settings key。
1010
+ - 写入 `group.index` 时必须传 `expected_index_etag`。
1011
+ - 服务端在同一事务内比较当前 `group.index` etag、写 indexed settings、写 `group.index`。
1012
+ - CAS 失败时错误消息包含 `group.index etag conflict`;SDK 的 `updateGroupIndex` 会重新读取当前 index、重建签名并按 `max_attempts` 重试。
1013
+ - `rules.attachments`、`announcement.attachments`、`join.attachments` 和 `{keyName}.attachments` 只保存附件引用;附件实体应先写入群自有区,推荐路径为 `group_aid:/.group/attachments/{rules|announcement|join|<keyName>}/...`。群自有区默认允许 `owner/admin` 写入,`member` 默认不可写;`.group/` 是系统控制目录,不允许授予 `role:member` 写权限。
1014
+
1015
+ ```python
1016
+ await client.call("group.set_settings", {
987
1017
  "group_id": "g-abc123.agentid.pub",
988
1018
  "settings": {"dispatch_mode": "mention"},
989
1019
  })
@@ -992,33 +1022,86 @@ await client.call("group.set_settings", {
992
1022
  **响应**:
993
1023
 
994
1024
  ```json
995
- {
996
- "group_id": "g-abc123.agentid.pub",
997
- "updated_keys": ["dispatch_mode"]
998
- }
999
- ```
1000
-
1001
- ### group.get_settings
1002
-
1003
- 统一读取群参数。成员可读;不传 `keys` 时返回核心群资料和 settings 表中的全部设置。未显式设置 `dispatch_mode` 时,服务端仍返回默认值 `"broadcast"`。
1025
+ {
1026
+ "group_id": "g-abc123.agentid.pub",
1027
+ "group_aid": "g-abc123.agentid.pub",
1028
+ "updated_keys": ["dispatch_mode"]
1029
+ }
1030
+ ```
1031
+
1032
+ 写入 `group.index` 成功时,响应顶层会强制携带 `_meta.group_indexes`:
1033
+
1034
+ ```json
1035
+ {
1036
+ "group_id": "g-abc123.agentid.pub",
1037
+ "group_aid": "g-abc123.agentid.pub",
1038
+ "updated_keys": ["announcement.content", "group.index"],
1039
+ "_meta": {
1040
+ "group_indexes": {
1041
+ "g-abc123.agentid.pub": {
1042
+ "etag": "\"sha256:...\"",
1043
+ "last_modified": 1780000000000,
1044
+ "schema": "aun.group.index.v1"
1045
+ }
1046
+ }
1047
+ }
1048
+ }
1049
+ ```
1050
+
1051
+ `group.index` 的正文格式:
1052
+
1053
+ ```jsonl
1054
+ {"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..."}
1055
+ {"key":"announcement.content","source":"db","etag":"\"sha256:...\"","last_modified":1780000000000}
1056
+ ```
1057
+
1058
+ `etag` 和 `body_hash` 都由 index 条目的 canonical JSONL bytes 计算。`signature` 覆盖去掉 `signature` 字段后的 `index_meta` 和正文条目,`signed_by` 必须等于本次 RPC actor AID。服务端不会根据 DB 状态生成 `group.index`。
1059
+
1060
+ ### group.get_settings
1061
+
1062
+ 统一读取群参数。成员可读;不传 `keys` 时返回核心群资料和 settings 表中的全部设置。未显式设置 `dispatch_mode` 时,服务端仍返回默认值 `"broadcast"`。读取 `keys=["group.index"]` 可从服务端摘取当前签名 `group.index`。
1004
1063
 
1005
1064
  **参数**:
1006
1065
 
1007
1066
  | 参数 | 类型 | 必填 | 说明 |
1008
1067
  |------|------|------|------|
1009
1068
  | `group_id` | string | 是 | 群组标识;兼容字段,值语义为目标态 `group_aid` |
1010
- | `keys` | array | 否 | 只读取指定 key,如 `["dispatch_mode", "rules.content"]` |
1069
+ | `keys` | array | 否 | 只读取指定 key,如 `["dispatch_mode", "rules.content"]`;读取 `["group.index"]` 时强制返回 `_meta.group_indexes` |
1011
1070
 
1012
1071
  **响应**:
1013
1072
 
1014
1073
  ```json
1015
- {
1016
- "group_id": "g-abc123.agentid.pub",
1017
- "settings": [
1018
- {"key": "dispatch_mode", "value": "broadcast", "updated_at": 1234567890000}
1019
- ]
1020
- }
1021
- ```
1074
+ {
1075
+ "group_id": "g-abc123.agentid.pub",
1076
+ "group_aid": "g-abc123.agentid.pub",
1077
+ "settings": [
1078
+ {"key": "dispatch_mode", "value": "broadcast", "updated_at": 1234567890000}
1079
+ ]
1080
+ }
1081
+ ```
1082
+
1083
+ 如果服务端已保存 `group.index`,普通 settings 读取可能在顶层返回 `_meta.group_indexes`。该 meta 受服务端注入频率控制;显式读取 `group.index` 时会强制返回:
1084
+
1085
+ ```json
1086
+ {
1087
+ "group_id": "g-abc123.agentid.pub",
1088
+ "group_aid": "g-abc123.agentid.pub",
1089
+ "settings": [
1090
+ {"key": "group.index", "value": {"body": "..."}, "updated_by": "alice.agentid.pub", "updated_at": 1780000000000}
1091
+ ],
1092
+ "_meta": {
1093
+ "group_indexes": {
1094
+ "g-abc123.agentid.pub": {
1095
+ "etag": "\"sha256:...\"",
1096
+ "last_modified": 1780000000000,
1097
+ "schema": "aun.group.index.v1"
1098
+ }
1099
+ }
1100
+ }
1101
+ }
1102
+ ```
1103
+
1104
+ SDK 观察到 `_meta.group_indexes` 只记录远端 etag,不会自动覆盖本地 index 或业务缓存。etag 不一致只表示本地与观察到的远端版本不同,方向由应用层决定:`checkGroupIndex` 用于检查是否不同步,`getGroupIndex` 用于显式 pull 远端 manifest 并同步本地缓存,`updateGroupIndex` 用于显式 CAS push 本地 indexed settings。
1022
1105
 
1023
1106
  ## 消息
1024
1107
 
@@ -1312,8 +1395,9 @@ result = await client.call("group.thought.get", {
1312
1395
 
1313
1396
  权限与签名约束:
1314
1397
 
1315
- - 群自有区是除 `memberdata` 等系统保留路径外的整个 `group_aid` namespace。`group_aid` 当前证书签名可写;`role:owner` 默认可写;`role:admin` 需要 owner 通过 `group.fs.set_acl` 显式授权后才可写。
1316
- - `group.fs.set_acl` / `group.fs.remove_acl` / `group.fs.get_acl` / `group.fs.list_acl` 只能由当前 group owner 调用,且当前只允许管理或查询 `grantee_aid="role:admin"` 的群自有区角色 ACL;成员升降级、退群、踢出不会联动授权或撤销。
1398
+ - 群自有区是除 `memberdata` 等系统保留路径外的整个 `group_aid` namespace。`group_aid` 当前证书签名可写;成员角色中 `owner/admin` 默认可写,`member` 默认不可写。`group_aid:/.group/` 是系统控制目录,用于群公告、群规则、入群要求附件,默认允许 `owner/admin` 写入。
1399
+ - 老群如果缺少 `.group/` 默认 ACL,group 服务会在该群首次被 RPC 访问时 best-effort 触发 namespace/ACL lazy repair;只有本次 baseline ACL 全部同步成功才记录本进程已检查,失败会在后续访问继续重试。
1400
+ - `group.fs.set_acl` / `group.fs.remove_acl` / `group.fs.get_acl` / `group.fs.list_acl` 只能由当前 group `owner/admin` 调用。当前支持 `grantee_aid="role:admin"` 与 `grantee_aid="role:member"`;`role:member` 只能授予具体业务目录的 `rw` 权限,不能授予根目录或 `.group/`,也不能获得删除、移动、重命名权限。成员升降级、退群、踢出不会联动授权或撤销目录 ACL。
1317
1401
  - `memberdata/{member_ref}` 写入默认只允许该成员本人;SDK 只传 group path,不拼接真实 storage 路径。
1318
1402
  - 上传控制面会透传 `parents` 到 storage:默认 `parents=true` 时可递归创建父目录,显式 `parents=false` 时父目录必须已存在。
1319
1403
  - JavaScript 浏览器版 `cp(string, group)` 默认把 string 当文本内容上传;Node 本地路径需显式传 `sourceType: "path"`、`localPath: true` 或使用 `local:` 前缀。Python、TypeScript 和 Go 默认把 string 当本地路径。
@@ -1344,21 +1428,21 @@ result = await client.call("group.thought.get", {
1344
1428
 
1345
1429
  ### group.fs.set_acl
1346
1430
 
1347
- 授予群自有区角色 ACL。需要当前 group owner 身份签名调用;底层由 group 服务以内部门面写入 `storage.set_acl`。
1348
-
1349
- 参数:`path` 必填,指向群自有区路径;`grantee_aid` 只能为 `role:admin`;`perms` 默认 `rwx`,必须包含写权限。`path` 可传 `group_aid:/archive` 等 group path。服务端写入 storage 内部权限位时会把 POSIX 删除位 `x` 映射为内部 `d`,对外响应仍显示 `rwx`。
1431
+ 授予群自有区角色 ACL。需要当前 group `owner/admin` 身份调用;底层由 group 服务以内部门面写入 `storage.set_acl`。
1432
+
1433
+ 参数:`path` 必填,指向群自有区路径;`grantee_aid` 可为 `role:admin` 或 `role:member`。`role:admin` 默认 `rwx`;`role:member` 只能为 `rw`,且只能授到具体业务目录,不能授到根目录或 `.group/`。`path` 可传 `group_aid:/archive` 等 group path。服务端写入 storage 内部权限位时会把 POSIX 删除位 `x` 映射为内部 `d`,对外响应仍显示 `rwx`;不授删除、移动、重命名权限时使用 `rw`。
1350
1434
 
1351
1435
  ### group.fs.remove_acl
1352
1436
 
1353
- 撤销群自有区角色 ACL。需要当前 group owner 身份签名调用;底层由 group 服务以内部门面写入 `storage.remove_acl`。
1354
-
1355
- 参数:`path` 必填,指向群自有区路径;`grantee_aid` 只能为 `role:admin`。撤销后,当前 admin 角色成员不再因该路径的 `role:admin` ACL 获得写权限。
1437
+ 撤销群自有区角色 ACL。需要当前 group `owner/admin` 身份调用;底层由 group 服务以内部门面写入 `storage.remove_acl`。
1438
+
1439
+ 参数:`path` 必填,指向群自有区路径;`grantee_aid` 可为 `role:admin` `role:member`。撤销 `role:member` 后,member 不再因该目录 ACL 获得创建/写入权限。
1356
1440
 
1357
1441
  ### group.fs.get_acl
1358
1442
 
1359
- 查询群自有区角色 ACL。需要当前 group owner 身份签名调用;普通 admin/member 不能查询。参数:`path` 必填,指向群自有区路径;可传裸路径 + `group_id`,也可传完整 `group_aid:/...`。
1360
-
1361
- 响应包含 `group_id`、`group_aid`、`path`、`area`、`storage` 和 `acls`。`acls[].perms` 使用 POSIX 视图,删除权限显示为 `x`,因此 owner 授权 `role:admin:rwx` 后查询也返回 `rwx`。
1443
+ 查询群自有区角色 ACL。需要当前 group `owner/admin` 身份调用;普通 member 不能查询。参数:`path` 必填,指向群自有区路径;可传裸路径 + `group_id`,也可传完整 `group_aid:/...`。
1444
+
1445
+ 响应包含 `group_id`、`group_aid`、`path`、`area`、`storage` 和 `acls`。`acls[].perms` 使用 POSIX 视图,删除权限显示为 `x`,因此授权 `role:admin:rwx` 后查询也返回 `rwx`;`role:member` 只应返回 `rw`。
1362
1446
 
1363
1447
  ### group.fs.list_acl
1364
1448
 
@@ -11,7 +11,7 @@ AUN SDK 文档位于 `docs/sdk/`,索引文件 `docs/sdk/INDEX.md` 分三层:
11
11
  - `AUNClient`:认证、连接、状态机、事件和 RPC。
12
12
  - `ServiceProxyClient`:Python SDK 的 Service Proxy provider 侧客户端,负责 Gateway 控制面注册和 proxy-server 数据面隧道注册。
13
13
 
14
- 业务 RPC 的底层参数见 `09-*-rpc-manual.md`,可通过 `client.call(method, params)` 调用;Storage、Collab、Group FS、Service Proxy 等具备高层门面的能力以对应专项文档为准。`message.send`、`message.thought.put`、`group.send`、`group.thought.put` 的业务 payload 见 `09-payload-reference.md`。群组标识以 `group_aid` 为主,`group_id` 只作为兼容参数名,详见 `09-group-rpc-manual.md`。在线轻量通知和跨域 federation notify 方案见 `Notify通知方案.md`。
14
+ 业务 RPC 的底层参数见 `09-*-rpc-manual.md`,可通过 `client.call(method, params)` 调用;Storage、Collab、Group FS、Service Proxy 等具备高层门面的能力以对应专项文档为准。`message.send`、`message.thought.put`、`group.send`、`group.thought.put` 的业务 payload 见 `09-payload-reference.md`。群组标识以 `group_aid` 为主,`group_id` 只作为兼容参数名;`group.index` 的签名索引、`_meta.group_indexes` 观察和 `expected_index_etag` CAS 详见 `09-group-rpc-manual.md`。在线轻量通知和跨域 federation notify 方案见 `Notify通知方案.md`。
15
15
 
16
16
  Storage 的 SDK VFS、控制面/数据面分离、direct backend 上传下载、类 Linux 权限、mount/symlink 和服务端分层见 `AUN Storage架构设计.md`。
17
17
  Group FS 的 `group.fs.*` RPC、`client.group.fs.*` 门面、`aun group fs` CLI、`cp/mv` 语义、群自有区角色 ACL 授权/撤销/查询与 `group_aid` 签名、`parents` 语义、JS string 差异和 memberdata 服务端映射见 `09-group-rpc-manual.md`。Collab 的 `gc`、`reflog`、`revert`、`clone` 及版本化文档/标签语义见 `09-collab-rpc-manual.md`。
@@ -31,7 +31,8 @@ Group FS 的 `group.fs.*` RPC、`client.group.fs.*` 门面、`aun group fs` CLI
31
31
  - E2EE:默认加密、ProtectedHeaders、P2P / Group V2
32
32
  - RPC 与事件:`client.call()`、`client.on()`、`client.notify()`、RPC 手册
33
33
  - Storage:SDK VFS、direct backend 数据面、`storage.*` low-level RPC、类 Linux 权限、mount/symlink、Storage Service 分层
34
- - 群文件系统:`group.fs.*`、`client.group.fs.*`、`aun group fs`、`cp/mv` 上传下载、群自有区角色 ACL 与 `group_aid` 签名、`parents`、JS string 差异和 memberdata 服务端映射(见 `09-group-rpc-manual.md`)
34
+ - Group RPC:`group_aid` / `group_id` 兼容、`group.index` 签名索引、`_meta.group_indexes`、`check/get/updateGroupIndex`、`expected_index_etag` CAS(见 `09-group-rpc-manual.md`、`06-API手册.md`)
35
+ - 群文件系统:`group.fs.*`、`client.group.fs.*`、`aun group fs`、`cp/mv` 上传下载、群自有区角色 ACL 与 `group_aid` 签名、`parents`、JS string 差异和 memberdata 服务端映射(见 `09-group-rpc-manual.md`)
35
36
  - 协作(collab):`collab.*` 版本化文档、乐观锁 CAS commit、三方合并、标签、GC、reflog、revert(见 `09-collab-rpc-manual.md`)
36
37
  - Service Proxy:`ServiceProxyClient`、`proxy.register_services`、proxy-server `register_services`
37
38
  - agent.md:`AIDStore.upload_agent_md()`、`AIDStore.download_agent_md()`、`AIDStore.check_agent_md()`、Gateway `_meta.agent_md_etags` 被动观察、`requester` / `peer` / `group` 角色
@@ -47,7 +48,7 @@ Group FS 的 `group.fs.*` RPC、`client.group.fs.*` 门面、`aun group fs` CLI
47
48
  |------|------|------|
48
49
  | 01 | [快速开始](01-快速开始.md) | 安装、三主体模型、最小示例 |
49
50
  | 02 | [WebSocket协议](02-WebSocket协议.md) | 握手流程、消息格式、裸 WebSocket |
50
- | 03 | [核心概念](03-核心概念.md) | AID、状态机、认证、E2EE |
51
+ | 03 | [核心概念](03-核心概念.md) | AID、状态机、认证、E2EE、Group Index 观察模型 |
51
52
  | 04 | [连接与认证](04-连接与认证.md) | AIDStore、连接、网关发现、事件、agent.md 自动观察 |
52
53
  | 05 | [E2EE加密通信](05-E2EE加密通信.md) | E2EE V2、ProtectedHeaders、agent.md 版本提示、recipient wrap |
53
54
  | 06 | [API手册](06-API手册.md) | AIDStore / AID / AUNClient / agent.md / ServiceProxyClient / 事件 / RPC |
@@ -70,7 +71,8 @@ Group FS 的 `group.fs.*` RPC、`client.group.fs.*` 门面、`aun group fs` CLI
70
71
  | 查方法签名 | [06-API手册](06-API手册.md) |
71
72
  | 查消息或群组 RPC | 对应 `09-*-rpc-manual.md` |
72
73
  | 查群组标识 `group_aid` / `group_id` 兼容规范 | [09-group-rpc-manual.md](09-group-rpc-manual.md) |
73
- | 查群文件系统 RPC / SDK / CLI 入口、群自有区角色 ACL 授权/撤销/查询、`parents` 和 JS string 差异 | [09-group-rpc-manual.md](09-group-rpc-manual.md)、[06-API手册](06-API手册.md) |
74
+ | group.index 签名索引、版本观察、不同步判断、CAS 更新和 facade | [03-核心概念.md](03-核心概念.md)、[06-API手册.md](06-API手册.md)、[09-group-rpc-manual.md](09-group-rpc-manual.md)、[08-最佳实践.md](08-最佳实践.md) |
75
+ | 查群文件系统 RPC / SDK / CLI 入口、群自有区角色 ACL 授权/撤销/查询、`parents` 和 JS string 差异 | [09-group-rpc-manual.md](09-group-rpc-manual.md)、[06-API手册](06-API手册.md) |
74
76
  | 查 Storage 架构、SDK VFS、权限模型、mount/symlink 和上传下载链路 | [AUN Storage架构设计.md](<AUN Storage架构设计.md>) |
75
77
  | 查 Storage RPC 参数 | [09-storage-rpc-manual.md](09-storage-rpc-manual.md) |
76
78
  | 查协作(版本化文档/乐观锁/标签/GC/reflog/revert)RPC | [09-collab-rpc-manual.md](09-collab-rpc-manual.md) |
@@ -10,16 +10,16 @@
10
10
  |------|------|
11
11
  | [01-快速开始](01-快速开始.md) | 安装 · 三主体模型 · 最小示例 · 多语言构造 |
12
12
  | [02-WebSocket协议](02-WebSocket协议.md) | 握手流程 · JSON-RPC 消息格式 · 裸 WebSocket 示例 |
13
- | [03-核心概念](03-核心概念.md) | AID · AIDStore · AUNClient · 九态状态机 · E2EE |
13
+ | [03-核心概念](03-核心概念.md) | AID · AIDStore · AUNClient · 九态状态机 · E2EE · Group Index 观察模型 |
14
14
  | [04-连接与认证](04-连接与认证.md) | 注册加载 · 认证连接 · 网关发现 · 事件 · agent.md 自动观察 |
15
15
  | [05-E2EE加密通信](05-E2EE加密通信.md) | E2EE V2 消息 · ProtectedHeaders · agent.md 版本提示 · recipient wrap |
16
16
  | [E2EE_V2消息通信时序图](E2EE_V2消息通信时序图.md) | V2 P2P/GROUP 明文与加密主链路 |
17
17
  | [06-API手册](06-API手册.md) | AIDStore · AID · AUNClient · 事件 · agent.md · E2EE 高级 API · RPC 索引 |
18
18
  | [07-错误处理](07-错误处理.md) | Result · 错误类层级 · 错误码 · 重试 |
19
- | [08-最佳实践](08-最佳实践.md) | 幂等连接 · 多 AID · 资源清理 · 测试数据保护 |
19
+ | [08-最佳实践](08-最佳实践.md) | 幂等连接 · 多 AID · 资源清理 · group.index 更新流程 · 测试数据保护 |
20
20
  | [09-payload-reference](09-payload-reference.md) | message / group / thought payload 格式 |
21
21
  | [09-message-rpc-manual](09-message-rpc-manual.md) | P2P 消息 RPC |
22
- | [09-group-rpc-manual](09-group-rpc-manual.md) | 群组 RPC(含 `group_aid` / `group_id` 兼容规范、`group.fs.*` 群文件系统 RPC、群自有区角色 ACL 授权/撤销/查询和 `parents` 语义) |
22
+ | [09-group-rpc-manual](09-group-rpc-manual.md) | 群组 RPC(含 `group_aid` / `group_id` 兼容规范、`group.index` 签名索引与 CAS、`group.fs.*` 群文件系统 RPC、群自有区角色 ACL 授权/撤销/查询和 `parents` 语义) |
23
23
  | [09-storage-rpc-manual](09-storage-rpc-manual.md) | 存储 RPC(对象 + POSIX VFS / 卷 / 软链 / ACL / token) |
24
24
  | [09-collab-rpc-manual](09-collab-rpc-manual.md) | 协作 RPC(版本化文档 / 乐观锁 / 三方合并 / 标签 / GC / reflog / revert) |
25
25
  | [group.fs POSIX 化详细设计](../aun-fs/group-fs/group.fs-POSIX化详细设计.md) | `client.group.fs.*` / `aun group fs` / `group.fs.*` 群文件系统设计,含群自有区角色 ACL、`parents` 和 JS string 语义 |
@@ -64,7 +64,7 @@
64
64
  - `client.call()` / `client.on()` → [04-连接与认证](04-连接与认证.md)、[06-API手册](06-API手册.md)
65
65
  - `client.notify()` 在线轻量通知、跨域 federation、在线/离线边界 → [Notify通知方案](Notify通知方案.md)
66
66
  - Message RPC → [09-message-rpc-manual](09-message-rpc-manual.md)
67
- - Group RPC、`group_aid` / `group_id` 兼容规范、群文件系统 `group.fs.*` 控制面、群自有区角色 ACL 授权/撤销/查询和 `parents` 语义 → [09-group-rpc-manual](09-group-rpc-manual.md)
67
+ - Group RPC、`group_aid` / `group_id` 兼容规范、`group.index` 签名索引、`_meta.group_indexes` 观察、`expected_index_etag` CAS、群文件系统 `group.fs.*` 控制面、群自有区角色 ACL 授权/撤销/查询和 `parents` 语义 → [09-group-rpc-manual](09-group-rpc-manual.md)
68
68
  - 下一版群文件系统 `group.fs.*`、`client.group.fs.*`、`aun group fs`、`cp/mv` POSIX 化语义和 JS string 差异 → [group.fs POSIX 化详细设计](../aun-fs/group-fs/group.fs-POSIX化详细设计.md)、[分阶段实施计划](../aun-fs/group-fs/group.fs-POSIX化分阶段实施计划.md)
69
69
  - Storage 架构、SDK VFS、控制面/数据面分离、类 Linux 权限和 mount/symlink → [AUN Storage架构设计](<AUN Storage架构设计.md>)
70
70
  - Storage RPC(对象 + `storage.fs.*` / `storage.volume.*` / `storage.fs.touch` / 软链 / ACL / token)→ [09-storage-rpc-manual](09-storage-rpc-manual.md)
@@ -93,9 +93,9 @@
93
93
 
94
94
  说明 Gateway WebSocket 握手、JSON-RPC 请求/响应/通知格式,以及裸 WebSocket 客户端如何借助 SDK 完成 token 获取。
95
95
 
96
- ### 03-核心概念
97
-
98
- 解释 AID 身份、三主体职责、device_id / slot_id 隔离键、九态状态机、认证挑战-响应、默认 E2EE 行为和 RPC/事件模型。
96
+ ### 03-核心概念
97
+
98
+ 解释 AID 身份、三主体职责、device_id / slot_id 隔离键、九态状态机、认证挑战-响应、默认 E2EE 行为、RPC/事件模型,以及 `group.index` 的 `_meta.group_indexes` 观察、不同步标记和应用层 pull/push 边界。
99
99
 
100
100
  ### 04-连接与认证
101
101
 
@@ -105,21 +105,21 @@
105
105
 
106
106
  覆盖默认加密发送、接收自动解密、E2EE V2 多设备 wrap、ProtectedHeaders、agent.md 版本提示与 E2EE 安全边界、`sender_signature` / AAD / recipient proof、群 E2EE 和高级存储扩展边界。
107
107
 
108
- ### 06-API手册
109
-
110
- 列出 AIDStore、AID、AUNClient、事件、agent.md、ServiceProxyClient、E2EE 高级 API 和 RPC 手册索引,包含 Python / TS / JS / Go 的主要命名差异。
111
-
112
- ### 07-错误处理
113
-
114
- 说明 Result 字典、AUNError 异常层级、错误码映射、重试策略和常见错误场景。
108
+ ### 06-API手册
109
+
110
+ 列出 AIDStore、AID、AUNClient、事件、agent.md、ServiceProxyClient、E2EE 高级 API、Group Index facade 和 RPC 手册索引,包含 Python / TS / JS / Go 的主要命名差异。
115
111
 
116
- ### 08-最佳实践
112
+ ### 07-错误处理
113
+
114
+ 说明 Result 字典、AUNError 异常层级、错误码映射、重试策略、`group.index etag conflict` CAS 冲突处理和常见错误场景。
117
115
 
118
- 给出幂等加载身份、连接、关闭、多 AID 管理、protected_headers、Flow Control 和测试数据保护建议。
116
+ ### 08-最佳实践
117
+
118
+ 给出幂等加载身份、连接、关闭、多 AID 管理、protected_headers、Flow Control、Group Index 更新流程和测试数据保护建议。
119
119
 
120
120
  ### 09-*-rpc-manual
121
121
 
122
- 各业务服务的 RPC 参数、响应和错误语义。Storage、Collab、Group FS、Service Proxy 等明确提供高层门面的能力应优先使用门面;需要精确控制底层参数时再通过 `client.call()` 调用业务 RPC。
122
+ 各业务服务的 RPC 参数、响应和错误语义。Group RPC 覆盖 `group.index` 签名索引、`expected_index_etag` CAS 和 `_meta.group_indexes` 观察。Storage、Collab、Group FS、Service Proxy 等明确提供高层门面的能力应优先使用门面;需要精确控制底层参数时再通过 `client.call()` 调用业务 RPC。
123
123
 
124
124
  ### AUN Storage架构设计
125
125