@agentunion/fastaun-browser 0.5.18 → 0.5.19

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 (118) hide show
  1. package/CHANGELOG.md +44 -2
  2. package/_packed_docs/CHANGELOG.md +44 -2
  3. package/_packed_docs/INDEX.md +136 -14
  4. package/_packed_docs/KITE_DOCS_GUIDE.md +42 -16
  5. package/_packed_docs/agent.md/SCHEMA.md +245 -205
  6. package/_packed_docs/aun/345/210/206/345/270/203/345/274/217/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +42 -15
  7. package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +4 -4
  8. 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 +45 -134
  9. 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 +5 -20
  10. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +28 -9
  11. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +22 -27
  12. package/_packed_docs/protocol/agent.md/SCHEMA.md +4 -0
  13. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +5 -2
  14. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +250 -283
  15. package/_packed_docs/sdk/09-group-rpc-manual.md +46 -14
  16. package/_packed_docs/sdk/09-message-rpc-manual.md +40 -2
  17. package/_packed_docs/sdk/09-storage-rpc-manual.md +74 -64
  18. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +25 -5
  19. package/_packed_docs/sdk/INDEX.md +76 -17
  20. package/dist/agent-md-schema.d.ts +3 -0
  21. package/dist/agent-md-schema.d.ts.map +1 -1
  22. package/dist/agent-md-schema.js +45 -11
  23. package/dist/agent-md-schema.js.map +1 -1
  24. package/dist/agent-md.d.ts +45 -2
  25. package/dist/agent-md.d.ts.map +1 -1
  26. package/dist/agent-md.js +519 -30
  27. package/dist/agent-md.js.map +1 -1
  28. package/dist/aid-store.d.ts +12 -46
  29. package/dist/aid-store.d.ts.map +1 -1
  30. package/dist/aid-store.js +113 -246
  31. package/dist/aid-store.js.map +1 -1
  32. package/dist/aid.d.ts.map +1 -1
  33. package/dist/aid.js +20 -7
  34. package/dist/aid.js.map +1 -1
  35. package/dist/auth.d.ts +4 -1
  36. package/dist/auth.d.ts.map +1 -1
  37. package/dist/auth.js +343 -23
  38. package/dist/auth.js.map +1 -1
  39. package/dist/bundle.js +37330 -32005
  40. package/dist/cert-utils.d.ts +1 -1
  41. package/dist/cert-utils.d.ts.map +1 -1
  42. package/dist/cert-utils.js +19 -7
  43. package/dist/cert-utils.js.map +1 -1
  44. package/dist/client/delivery.d.ts +15 -1
  45. package/dist/client/delivery.d.ts.map +1 -1
  46. package/dist/client/delivery.js +147 -51
  47. package/dist/client/delivery.js.map +1 -1
  48. package/dist/client/rpc-pipeline.d.ts.map +1 -1
  49. package/dist/client/rpc-pipeline.js +19 -5
  50. package/dist/client/rpc-pipeline.js.map +1 -1
  51. package/dist/client/v2-e2ee.d.ts +1 -0
  52. package/dist/client/v2-e2ee.d.ts.map +1 -1
  53. package/dist/client/v2-e2ee.js +104 -30
  54. package/dist/client/v2-e2ee.js.map +1 -1
  55. package/dist/client.d.ts +100 -1
  56. package/dist/client.d.ts.map +1 -1
  57. package/dist/client.js +1204 -23
  58. package/dist/client.js.map +1 -1
  59. package/dist/errors.d.ts.map +1 -1
  60. package/dist/errors.js +3 -2
  61. package/dist/errors.js.map +1 -1
  62. package/dist/events.d.ts +4 -0
  63. package/dist/events.d.ts.map +1 -1
  64. package/dist/events.js +41 -1
  65. package/dist/events.js.map +1 -1
  66. package/dist/facades.d.ts +82 -2
  67. package/dist/facades.d.ts.map +1 -1
  68. package/dist/facades.js +98 -4
  69. package/dist/facades.js.map +1 -1
  70. package/dist/index.d.ts +7 -3
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +3 -2
  73. package/dist/index.js.map +1 -1
  74. package/dist/keystore/index.d.ts +17 -0
  75. package/dist/keystore/index.d.ts.map +1 -1
  76. package/dist/keystore/indexeddb-shared.d.ts +10 -1
  77. package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
  78. package/dist/keystore/indexeddb-shared.js +111 -0
  79. package/dist/keystore/indexeddb-shared.js.map +1 -1
  80. package/dist/keystore/indexeddb-token-store.d.ts +7 -1
  81. package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
  82. package/dist/keystore/indexeddb-token-store.js +30 -1
  83. package/dist/keystore/indexeddb-token-store.js.map +1 -1
  84. package/dist/org-protocol.d.ts +98 -0
  85. package/dist/org-protocol.d.ts.map +1 -0
  86. package/dist/org-protocol.js +1742 -0
  87. package/dist/org-protocol.js.map +1 -0
  88. package/dist/ownership-proof.d.ts +93 -5
  89. package/dist/ownership-proof.d.ts.map +1 -1
  90. package/dist/ownership-proof.js +239 -53
  91. package/dist/ownership-proof.js.map +1 -1
  92. package/dist/ownership-v21.d.ts +177 -0
  93. package/dist/ownership-v21.d.ts.map +1 -0
  94. package/dist/ownership-v21.js +609 -0
  95. package/dist/ownership-v21.js.map +1 -0
  96. package/dist/ownership-workflow.d.ts +146 -0
  97. package/dist/ownership-workflow.d.ts.map +1 -0
  98. package/dist/ownership-workflow.js +1066 -0
  99. package/dist/ownership-workflow.js.map +1 -0
  100. package/dist/seq-tracker.d.ts +1 -0
  101. package/dist/seq-tracker.d.ts.map +1 -1
  102. package/dist/seq-tracker.js +10 -2
  103. package/dist/seq-tracker.js.map +1 -1
  104. package/dist/tools/cross-sdk-agent.d.ts +82 -0
  105. package/dist/tools/cross-sdk-agent.d.ts.map +1 -1
  106. package/dist/tools/cross-sdk-agent.js +332 -7
  107. package/dist/tools/cross-sdk-agent.js.map +1 -1
  108. package/dist/transport.d.ts +6 -0
  109. package/dist/transport.d.ts.map +1 -1
  110. package/dist/transport.js +88 -2
  111. package/dist/transport.js.map +1 -1
  112. package/dist/v2/e2ee/decrypt.d.ts +1 -0
  113. package/dist/v2/e2ee/decrypt.d.ts.map +1 -1
  114. package/dist/v2/e2ee/decrypt.js +9 -1
  115. package/dist/v2/e2ee/decrypt.js.map +1 -1
  116. package/dist/version.d.ts +1 -1
  117. package/dist/version.js +1 -1
  118. package/package.json +1 -1
@@ -92,98 +92,11 @@ AID 命名规则:
92
92
  }
93
93
  ```
94
94
 
95
- **说明**:
96
- - Gateway 将请求转发到 Auth 服务,Auth 服务调用 CA 签发证书
97
- - 创建 AID 时固定签发 P-256 证书,确保最大兼容性
98
- - 协议默认允许创建任意 `aid`;命名冲突、抢注、保留名、审批制等约束由具体网络运营策略决定
99
- - 客户端需保存返回的证书和本地生成的私钥
100
-
101
- ### 1.3.1 带 type/owner 的新注册流程
102
-
103
- `auth.create_aid` 只负责签发证书,保持 legacy 兼容语义,不创建 owner relation。支持 owner 的新身份由 SDK 先完成证书签发,再调用以下可恢复 operation:
104
-
105
- ```text
106
- 证书签发(auth.create_aid)
107
- → auth.aid_register_prepare
108
- → auth.aid_register_submit(subject/owner 签名,可分批)
109
- → 使用 owner_operation_id 发布带 ownership_proof 的 agent.md
110
- → auth.aid_register_activate
111
- ```
112
-
113
- #### auth.aid_register_prepare
114
-
115
- | 参数 | 类型 | 必需 | 说明 |
116
- |------|------|:----:|------|
117
- | `aid`(或 `subject_aid`) | string | 是 | subject AID;服务端规范化为小写 |
118
- | `type`(或 `aid_type`) | string | 是 | `human`、`agent`、`group`、`service`、`device`、`host`、`org`、`custom` |
119
- | `owner`(或 `owner_aid`) | string | 条件 | 非 `human` 必填;`agent` 可与 subject 相同 |
120
- | `idempotency_key` | string | 否 | 相同 kind/subject/key 返回同一 operation |
121
-
122
- 约束:`human` 不得指定 owner;非 `human` 必须指定 owner;只有 `agent` 允许 self-owner;外部 owner 必须是已登记且状态为 `active` 或 `not_applicable` 的 `human`/`agent`,并且不能形成 owner 环。prepare 成功后 operation 的初始 state 为 `proof_pending`(无 owner 的 human 为 `agent_md_pending`),TTL 固定为 7 天。
123
-
124
- Auth 可登记 `org` 关系类型;但当前 CA/Name Service 只实现 `signing` 与 `group_identity` 证书用途,尚未实现 `org_identity` 映射。组织身份若使用现有流程,不能按已实现的组织专用证书用途对外承诺。
125
-
126
- **响应**(字段会按场景返回):
127
-
128
- ```json
129
- {
130
- "operation_id": "op-...",
131
- "kind": "register",
132
- "aid": "sensor.agentid.pub",
133
- "subject_aid": "sensor.agentid.pub",
134
- "type": "agent",
135
- "owner": "alice.agentid.pub",
136
- "owner_aid": "alice.agentid.pub",
137
- "state": "proof_pending",
138
- "operation_state": "proof_pending",
139
- "ownership_status": "pending",
140
- "relation_version": 0,
141
- "proof_id": "550e8400-e29b-41d4-a716-446655440000",
142
- "fact_hash": "<64 lowercase hex>",
143
- "statement_hash": "<64 lowercase hex>",
144
- "expires_at": "2026-10-13T00:00:00Z"
145
- }
146
- ```
147
-
148
- #### auth.aid_register_submit
149
-
150
- 请求至少包含 `operation_id`,并可分批提交:
151
-
152
- | 参数 | 类型 | 说明 |
153
- |------|------|------|
154
- | `subject_signature` | object | subject 对 ownership statement 的签名 |
155
- | `owner_signature` | object | 外部 owner 对同一 statement 的签名;self-owner 禁止 |
156
-
157
- 签名封套只允许 `cert_fingerprint`(`sha256:<64 hex>`)和严格 Base64 的 `signature`。提交后双方签名齐全时 state 变为 `agent_md_pending`;重复提交相同签名幂等,替换已保存签名返回 `owner_relation_conflict`。
158
-
159
- #### auth.aid_register_activate / auth.aid_register_status
160
-
161
- `auth.aid_register_activate` 只接受 `operation_id`。客户端必须先用该 operation 的一次性 `owner_operation_id` 发布与 operation 完全匹配的 `agent.md`,成功后返回 `ownership_status=active`(`human` 返回 `not_applicable`)和 `relation_version=1`。`auth.aid_register_status` 接受 `aid`,返回当前登记或 pending operation 的状态。
162
-
163
- ### 1.3.2 已有 AID 的 aid_bind 流程
164
-
165
- 旧客户端通过 `auth.create_aid` 创建的 AID,以及已被 `owner_relation_unbind` 解除关系的 AID,使用 `auth.aid_bind_prepare`、`auth.aid_bind_submit`、`auth.aid_bind_activate` 和 `auth.aid_bind_status` 建立或重建关系。该流程不签发新证书、不改变 AID、密钥、登录或消息通信身份;绑定期间状态为 `legacy_unbound`/`pending`,基本登录和通信仍可用。
166
-
167
- `aid_bind_prepare` 的参数和签名规则与新注册相同,但 active relation 不能被 bind 替换;已存在的 type/owner 只能重复提交完全相同的值。绑定失败或 operation 过期不会吊销证书。`auth.aid_operation_get` 接受 `operation_id`,用于进程重启后查询并恢复 pending operation。
168
-
169
- ### 1.3.3 Ownership proof 与 canonical bytes
170
-
171
- 四端实现必须对同一 UTF-8 字节序列计算摘要和签名:
172
-
173
- ```text
174
- fact = canonical_json({"subject_aid": subject_aid, "owner_aid": owner_aid})
175
- statement = canonical_json({"proof_id": proof_id, "subject_aid": subject_aid, "owner_aid": owner_aid})
176
- signing_bytes = UTF-8("AUN-AID-OWNER-RELATION-V1;") || statement
177
- ```
178
-
179
- 对象键按字典序、无空格;AID 先规范化为 ASCII 小写;`proof_id` 必须为 UUID v4。`fact_hash=SHA-256(fact)`,`statement_hash=SHA-256(signing_bytes)`,均为裸小写十六进制。agent.md 的 `owner` 与 `ownership_proof` 必须同时出现;proof 的 `subject_aid`/`owner_aid` 必须分别等于 agent.md 的 `aid`/`owner`。`human` 不得携带这两个字段。
180
-
181
- ### 1.3.4 Owner change、解绑与 type 变更
182
-
183
- - `auth.owner_change_prepare` 参数为 `subject_aid`、`new_owner_aid`、可选 `current_owner_aid`、`expected_relation_version`、`idempotency_key`;只允许当前 owner 发起,并检查 CAS、owner 类型和环。operation 的 `transfer_payload` 包含 `operation_id`、subject、old/new owner、new proof、当前 relation version、challenge nonce 和过期时间。
184
- - `auth.owner_change_submit` 接收 `old_owner_signature`、`subject_signature`、`new_owner_signature`。old owner 签署 `AUN-AID-OWNER-TRANSFER-V1;` 加 `transfer_payload`;subject 和 new owner 签署新的 ownership statement。三份签名齐全后发布新 agent.md,再调用 `auth.owner_change_activate`。
185
- - 激活成功后 `relation_version` 递增;旧 owner 的 relation ACL 被撤销但数据保留,新 owner 的 ACL 被创建。subject 自身签名不能替代 old owner 授权。
186
- - `auth.owner_relation_status` 查询当前关系;`auth.owner_relation_unbind` 只允许当前 owner(可带 `expected_relation_version`),状态变为 `unbound`,版本递增,证书和数据保留;`auth.aid_type_change` 修改登记 type,但有 active 子关系时拒绝。
95
+ **说明**:
96
+ - Gateway 将请求转发到 Auth 服务,Auth 服务调用 CA 签发证书
97
+ - 创建 AID 时固定签发 P-256 证书,确保最大兼容性
98
+ - 协议默认允许创建任意 `aid`;命名冲突、抢注、保留名、审批制等约束由具体网络运营策略决定
99
+ - 客户端需保存返回的证书和本地生成的私钥
187
100
 
188
101
  ## 1.4 auth.aid_login1 / auth.aid_login2
189
102
 
@@ -356,48 +269,48 @@ signature = ECDSA_sign(private_key, SHA256(message))
356
269
  {
357
270
  "jsonrpc": "2.0",
358
271
  "id": 4,
359
- "result": {
360
- "success": true,
361
- "access_token": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9...",
362
- "refresh_token": "new_refresh_token...",
363
- "expires_in": 3600,
364
- "aid": "alice.agentid.pub",
365
- "refresh_count": 12,
366
- "relogin_required": false,
367
- "retryable": false,
368
- "diagnostic": {
369
- "aid": "alice.agentid.pub",
370
- "refresh_count": 12
371
- }
372
- }
373
- }
374
- ```
272
+ "result": {
273
+ "success": true,
274
+ "access_token": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9...",
275
+ "refresh_token": "new_refresh_token...",
276
+ "expires_in": 3600,
277
+ "aid": "alice.agentid.pub",
278
+ "refresh_count": 12,
279
+ "relogin_required": false,
280
+ "retryable": false,
281
+ "diagnostic": {
282
+ "aid": "alice.agentid.pub",
283
+ "refresh_count": 12
284
+ }
285
+ }
286
+ }
287
+ ```
375
288
 
376
289
  **说明**:
377
290
  - 调用时提交当前持有的 `refresh_token`
378
- - 服务端验证后吊销旧 `refresh_token`,签发新的 `access_token` 和 `refresh_token`
379
- - 旧 access_token 在其过期时间前仍然有效(JWT 标准行为),但客户端应立即切换到新 token
380
- - 建议在 access_token 过期前 60 秒刷新
381
- - 响应包含结构化状态字段:`relogin_required=true` 表示客户端必须放弃本地 token 并重新登录;`retryable=true` 表示可退避重试;`diagnostic` 只包含脱敏诊断字段
382
-
383
- **失败响应示例**:
384
-
385
- ```json
386
- {
387
- "success": false,
388
- "error": "invalid_or_expired_refresh_token",
389
- "relogin_required": true,
390
- "retryable": false,
391
- "diagnostic": {
392
- "refresh_token_hash_prefix": "sha256:abcd..."
393
- }
394
- }
395
- ```
396
-
397
- **刷新限制**:
398
- - 刷新链总时长不超过 30 天,或最多刷新 720 次
399
- - 达到限制后返回 `relogin_required=true`,客户端必须重新执行完整的两阶段认证
400
- - 具体限制值由服务端实现决定
291
+ - 服务端验证后吊销旧 `refresh_token`,签发新的 `access_token` 和 `refresh_token`
292
+ - 旧 access_token 在其过期时间前仍然有效(JWT 标准行为),但客户端应立即切换到新 token
293
+ - 建议在 access_token 过期前 60 秒刷新
294
+ - 响应包含结构化状态字段:`relogin_required=true` 表示客户端必须放弃本地 token 并重新登录;`retryable=true` 表示可退避重试;`diagnostic` 只包含脱敏诊断字段
295
+
296
+ **失败响应示例**:
297
+
298
+ ```json
299
+ {
300
+ "success": false,
301
+ "error": "invalid_or_expired_refresh_token",
302
+ "relogin_required": true,
303
+ "retryable": false,
304
+ "diagnostic": {
305
+ "refresh_token_hash_prefix": "sha256:abcd..."
306
+ }
307
+ }
308
+ ```
309
+
310
+ **刷新限制**:
311
+ - 刷新链总时长不超过 30 天,或最多刷新 720 次
312
+ - 达到限制后返回 `relogin_required=true`,客户端必须重新执行完整的两阶段认证
313
+ - 具体限制值由服务端实现决定
401
314
 
402
315
  ## 1.6 证书生命周期方法
403
316
 
@@ -646,9 +559,7 @@ signature = ECDSA_sign(private_key, SHA256(message))
646
559
  | `-32003` | Signature verification failed — 签名验证失败 |
647
560
  | `-32005` | Authentication expired — Token 过期或刷新链耗尽 |
648
561
 
649
- > 通用 JSON-RPC 2.0 错误码(-32700/-32600/-32601/-32602/-32603)同样适用,见 [07-JSON-RPC](07-JSON-RPC.md)。
650
-
651
- Owner relation 方法使用 JSON-RPC `-32602`,并在 `error.data.error_code` 中返回稳定错误码;完整列表和 `signature_verification_unavailable`、`type_change_blocked`、`aid_binding_required` 的说明见 [07-错误码与状态机](07-错误码与状态机.md) §7.1。
562
+ > 通用 JSON-RPC 2.0 错误码(-32700/-32600/-32601/-32602/-32603)同样适用,见 [07-JSON-RPC](07-JSON-RPC.md)。
652
563
 
653
564
  ## 1.9 安全说明
654
565
 
@@ -19,10 +19,8 @@
19
19
  | -32001 | Authentication failed(认证失败) | 检查凭据,重新登录 |
20
20
  | -32002 | Certificate/Nonce invalid(凭据无效) | 检查证书链或 nonce |
21
21
  | -32003 | Signature verification failed(签名验证失败) | 检查私钥,不重试 |
22
- | -32004 | Permission denied(权限拒绝) | 提示用户,不重试 |
23
- | -32005 | Authentication expired(Token 过期) | 刷新 token 或重新登录 |
24
-
25
- Owner relation RPC 在 `-32602 Invalid params` 的 `error.data.error_code` 中返回稳定错误码:`invalid_aid`、`invalid_aid_type`、`human_owner_forbidden`、`owner_required`、`self_owner_not_allowed`、`owner_not_verified`、`owner_type_forbidden`、`owner_relation_conflict`、`pending_operation_exists`、`operation_not_found`、`operation_expired`、`signature_invalid`、`signature_verification_unavailable`、`relation_version_conflict`、`idempotency_key_reuse`、`type_change_blocked`、`aid_binding_required`。`signature_verification_unavailable` 表示 owner 证书验证服务不可用;`type_change_blocked` 表示该 AID 仍是活动 owner;`aid_binding_required` 表示尚无已登记 type,需先完成 `aid_bind`。JSON-RPC 外层错误码仍为 `-32602`。
22
+ | -32004 | Permission denied(权限拒绝) | 提示用户,不重试 |
23
+ | -32005 | Authentication expired(Token 过期) | 刷新 token 或重新登录 |
26
24
 
27
25
  ### 7.1.3 AUN 协议级错误码(连接与会话)
28
26
 
@@ -104,7 +102,7 @@ Owner relation RPC 在 `-32602 Invalid params` 的 `error.data.error_code` 中
104
102
 
105
103
  | 错误码 | 说明 | 客户端处理 |
106
104
  |--------|------|-----------|
107
- | -33001 | Group not found | 检查规范化后的 `group_aid`(`group_id` 为兼容参数名) |
105
+ | -33001 | Group not found | 检查规范化后的 `group_aid`(`group_id` 为兼容参数名) |
108
106
  | -33002 | Group state invalid(群状态不允许该操作) | 检查群状态 |
109
107
  | -33003 | Group suspended | 等待恢复或联系管理员 |
110
108
  | -33004 | Group member limit reached | 不重试 |
@@ -222,21 +220,8 @@ submitted → working → completed
222
220
  | input_required | | working, failed, canceled |
223
221
  | rejected | 是 | |
224
222
  | completed | 是 | |
225
- | failed | 是 | |
226
- | canceled | 是 | |
227
-
228
- ### 7.4.1 Owner relation operation 状态机
229
-
230
- ```text
231
- proof_pending
232
- → agent_md_pending
233
- → active
234
-
235
- proof_pending / agent_md_pending
236
- → expired
237
- ```
238
-
239
- `human` 注册在 agent.md 发布后进入 `not_applicable`;legacy AID 可处于 `legacy_unbound`,解绑后的关系为 `unbound`,因 owner 状态不可用时关系可标为 `unusable`,旧证书和数据保留。`owner_change` 从当前 `active` 关系创建 pending operation,三方签名和新 agent.md 激活后回到 `active`,`relation_version` 递增;CAS 不匹配或重复 pending operation 保持原关系不变。
223
+ | failed | 是 | |
224
+ | canceled | 是 | |
240
225
 
241
226
  ## 7.5 处理原则
242
227
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **适用版本**:AUN 1.0 | **状态**:Draft
4
4
 
5
- Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。Group 服务本身是一个 AID 持有者,客户端通过标准 `message.*` 协议与 Group 服务通信,Group 服务通过 JSON-RPC 2.0 暴露 `group.*` 命名空间方法。
5
+ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。Group 服务本身是一个 AID 持有者,客户端通过标准 `message.*` 协议与 Group 服务通信,Group 服务通过 JSON-RPC 2.0 暴露 `group.*` 命名空间方法。服务 AID、群身份 `group_aid` 与群主 `owner_aid` 是三个不同角色。群主关系由 Group 生命周期管理,不走 Ownership 2.1 的双文件绑定、释放、转移、审批或 NS 关系账本。
6
6
 
7
7
  ---
8
8
 
@@ -33,7 +33,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
33
33
  | `owner_aid` | string | 群主 AID |
34
34
  | `creator_aid` | string | 创建者 AID |
35
35
  | `visibility` | string | `"public"` / `"private"` |
36
- | `status` | string | `"active"` / `"suspended"` / `"closed"` |
36
+ | `status` | string | `"active"` / `"suspended"` / `"dissolved"` |
37
37
  | `description` | string | 群组描述 |
38
38
  | `metadata` | object | 自定义元数据 |
39
39
  | `mention_mode` | string | 群提及过滤模式:`"disabled"`(默认)/ `"mention-only"`,详见 [10.2.3 群提及过滤模式](#1023-群提及过滤模式mention_mode) |
@@ -91,7 +91,7 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
91
91
  | `group_id` | string | 群组 ID |
92
92
  | `role` | string | `"owner"` / `"admin"` / `"member"` |
93
93
  | `joined_at` | integer | 加入时间(Unix 秒) |
94
- | `last_ack_seq` | integer | 最后已读消息序号 |
94
+ | `last_ack_seq` | integer | 投递消费确认位置,与业务已读位置独立 |
95
95
 
96
96
  ### Member Status 对象
97
97
 
@@ -146,6 +146,8 @@ Group 服务是 AUN 协议的应用层扩展,提供多人群组通信能力。
146
146
 
147
147
  ### `group.create`
148
148
 
149
+ 创建自动建立调用者与群的 owner 关系;群身份公私钥及证书由该 owner 持有,Group 服务不接收或保存群私钥。群名片须含当前 `owner`,不含通用 `ownership` 声明;由当前 owner 使用本人证书和私钥代签、代上传,文件 `aid` 仍是 `group_aid`。签名块 `signer_aid`、V2 上传授权、实体证书代际和条件恢复见 [Ownership 协议定义 2.1 §2.5](Ownership协议定义2.1.md#25-grouporg-名片的-owner-代签与上传)。创建、群证书绑定和名片发布的参数/响应以 [Group RPC Manual](../sdk/09-group-rpc-manual.md#groupcreate) 为准。
150
+
149
151
  创建群组。
150
152
 
151
153
  SDK 高层建群流程必须支持崩溃恢复:命名群复用已持久化密钥并重放相同 `group_name + public_key` 的已提交结果;匿名群复用已持久化的创建上下文,使响应丢失后的重试返回同一数字群,再继续群身份绑定和 `agent.md` 上传。服务端必须原子提交群记录、群主成员、成员索引、入群设置、首个 `group.changed` 事件及匿名创建映射。直接调用 RPC 且没有 SDK 恢复上下文时,每次调用仍表示一次新的自动群创建。
@@ -244,7 +246,7 @@ SDK 高层建群流程必须支持崩溃恢复:命名群复用已持久化密
244
246
 
245
247
  ### `group.dissolve`
246
248
 
247
- 永久解散群组。需要 **owner** 权限。解散后不可恢复。
249
+ 永久解散群组。需要 **owner** 权限。解散后不可恢复,自动解除有效 owner 关系,终止待处理转移并撤销群证书及相关授权;旧 owner、旧证书、实体 token 和旧 pending 均不能继续上传群名片或代表群鉴权。历史 owner 和签名记录保留用于审计,不作为当前授权。解散墓碑及待转移清理先原子提交;事件发布、CA 撤销、Storage 权限失效与缓存清理通过持久 outbox 收尾,未全完成返回 -32002、status=unavailable/retryable=true/committed=true,重试续跑收尾,不能提前宣告成功。
248
250
 
249
251
  **参数**:`group_id` (string, 必填)
250
252
 
@@ -313,11 +315,19 @@ SDK 高层建群流程必须支持崩溃恢复:命名群复用已持久化密
313
315
 
314
316
  ### `group.transfer_owner`
315
317
 
316
- 转让群主身份。需要 **owner** 权限。受让方无需手动确认,SDK 自动完成确认和转让收尾。
318
+ 发起两阶段群主转让。需要 **owner** 权限,只建立 `pending_rekey`,暂不切换 owner;新 owner 通过 `group.complete_transfer` 提交本人接受证明和新群公钥,完成强制 rekey 后切换 owner,原 owner 降为 admin。旧群证书失效,新身份材料归新 owner;新 owner 按当前代际重新代签、代上传含新 `owner` 的群名片。
317
319
 
318
320
  **参数**:`group_id` (必填), `new_owner` (必填,新群主 AID;别名 `aid` 向后兼容)
319
321
 
320
- **响应**:`{ "group": { ... }, "new_owner_aid": "bob.agentid.pub" }`
322
+ **响应**:`{ "status": "pending_rekey", "requires_ca_rekey": true, "complete_rpc": "group.complete_transfer", "group": { ... }, "new_owner": "bob.agentid.pub" }`。完整参数、旧群身份授权、新 owner 接受证明及幂等规则见 [Group RPC Manual](../sdk/09-group-rpc-manual.md#grouptransfer_owner)。
323
+
324
+ ### `group.complete_transfer`
325
+
326
+ 仅待转移的新 owner 可完成,必须生成新群密钥并提交 `transfer_accept`,禁止同密钥续证代替 rekey。成功状态为 `transferred`;重复提交同一已完成转移可返回原结果。名片发布失败不反向撤销已提交的 owner 切换,SDK 保留新代际原字节和原 CAS 条件恢复上传。服务持久原已验证证书及 transfer nonce/旧 serial CAS,已提交 CA 的可恢复待办超 TTL 仍收敛,未提交 CA 的过期待办拒绝,旧请求不得提交新的转移。
327
+
328
+ ### `group.bind_group_aid` / `group.renew_group_aid`
329
+
330
+ `bind_group_aid` 为匿名群补齐专属群身份,不是 Ownership 绑定;仅当前 owner 可操作,匹配公钥可幂等重放,不同公钥拒绝。`renew_group_aid` 是当前 owner 主动换钥,必须持有旧群私钥并提交换钥证明;它不替代两阶段 owner 转移。成功后 owner 持有新材料,并用本人身份重新代签、代上传群名片。
321
331
 
322
332
  ### `group.get_members`
323
333
 
@@ -504,7 +514,7 @@ History 不推进消息或事件 ACK,不修改 cursor/floor/Pull activity,
504
514
 
505
515
  ### `group.ack`
506
516
 
507
- 提交已读游标(per-AID,非 per-device)。
517
+ 提交投递消费游标。SDK 的多设备/slot 游标按当前实例隔离;业务已读独立使用 `group.read/read_state`,不能以 ACK 表示用户已经阅读话题。
508
518
 
509
519
  **参数**:`group_id` (必填), `seq` (integer, 必填)
510
520
 
@@ -512,7 +522,15 @@ History 不推进消息或事件 ACK,不修改 cursor/floor/Pull activity,
512
522
 
513
523
  ---
514
524
 
515
- ## 10.7 入群方式
525
+ ### `group.read` / `group.read_state`
526
+
527
+ `group.read` 以 `states` 上报当前认证 AID/device 的群话题最后已读消息,每项包含 `group_id`、原样保存的 `topic_key`、`last_read_message_id`;缺省 scope 为 `group`。只有省略 `states` 时兼容顶层单条,显式空数组/null 拒绝;四个已读门面保留显式空值供服务端校验。历史 Group ID 别名解析为 canonical ID,新写状态键、响应和事件使用 canonical ID,历史别名参与事实/公共位置/设备映射的事务查询,权限复用既有版本同步。回执是设备写入结果,不是共享汇总。同域先校验全部项;混合域按所属域逐域校验和提交,任何域失败则 RPC 返回错误,已提交域不回滚,原样幂等重试可收敛。
528
+
529
+ `group.read_state` 按当前 AID 的 `group_id`、`topic_key` 可选条件查询共享汇总;未指定群时发现本域及远域有权限的成员群。响应 `states` 包含公共 `last_read_order`、当前设备 `current_device_seq` 和 `mapping_status`(resolved/not_received/unresolved);无映射 seq 为 null。晚到公共位置对仍匹配该消息且 order=0 的事实条件持久回填,不能只更新缓存或覆盖并发前进的事实。网络整数保持 int64 语义,Gateway 本域服务及 federation 回程不得经浮点中转,TS/JS API 超安全整数使用精确十进制字符串。
530
+
531
+ 共享位置已提交并前进后发布 `event/group.read_changed`,SDK 订阅名为 `group.read_changed`,owner 必须非空且为当前身份,scope 必须匹配原事件;Gateway 校验 Kernel 转发的可信 Group 来源,即使显式 route 也只向该 owner AID 分发,支持所属域向该外域成员 AID 转发,不能广播给其他成员。事件 ID 对身份、话题及公共位置组成的 JSON 元组取 SHA-256,失败日志不泄露 topic。事件包含 owner AID、scope、group、topic、消息 ID、公共顺序和更新时间,不进入 Pull 队列。SDK 重连保留原查询过滤范围,通过仅本地发布的 `read_state_sync` 交付本轮状态及逐项错误;身份切换按代际隔离旧缓存及补偿完成事件,A→B→A 也不能接收旧代际结果;原在途 RPC 仍可返回。完整契约见 `aun-sdk-core/docs/跨设备已读未读详细设计.md`。
532
+
533
+ ## 10.7 入群方式
516
534
 
517
535
  ### `group.request_join`
518
536
 
@@ -776,7 +794,8 @@ Group 服务通过 `event/group.*` 事件推送变更通知给相关 AID。
776
794
  | `member_left` | 成员退出 |
777
795
  | `member_removed` | 成员被踢出 |
778
796
  | `role_changed` | 角色变更 |
779
- | `owner_transferred` | 群主转让 |
797
+ | `owner_transfer_rekey_pending` | 群主转让已发起,等待新 owner 完成强制换钥与确认 |
798
+ | `owner_transferred` | 强制 rekey 后群主转让完成 |
780
799
  | `rules_updated` | 规则更新 |
781
800
  | `announcement_updated` | 公告更新 |
782
801
  | `join_requested` | 收到入群申请 |
@@ -31,6 +31,14 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
31
31
 
32
32
  ## 11.3 控制面方法
33
33
 
34
+ **权威对象与路径修订**:`storage.head_object`、`storage.get_object` 和 `storage.fs.stat` 可传 `consistency: authoritative`,绕过正向、负向缓存并确认恢复可用性。结果包含 `consistency`、`exists`、不透明 `revision`、`owner_aid`、`bucket`、无前导斜杠的 `path` 和 Unix 秒 `observed_at`;存在时附 `sha256`、`object_id`、`version`,get 另返回完整严格 Base64 `content`。故障、权限错误和恢复未完成必须失败,不能返回 `exists=false`;下载或网关 404 不能证明权威不存在。
35
+
36
+ `revision` 属于逻辑路径,每次成功写入、删除后变化,删除后保留;从未创建的修订为字符串 `0`,同内容重建也不得复用旧修订。写入与删除的 `expected_revision` 必须使用调用者先前权威读取的原值,与对象 `expected_version`、ETag 和内容摘要不同。条件冲突返回既有 `-32009`,不得刷新条件强行继续旧任务。
37
+
38
+ `put_object`、`create_upload_session`、`complete_upload`、`delete_object` 和 `storage.fs.remove` 支持 `expected_revision`。条件上传 session 固定目标和原修订,响应带 `session_id`、`expected_revision`,complete 按同一 session 在最终发布时再次 CAS;内容与路径修订在 Storage 本地事务中原子发布,失败保留旧完整文件。普通不带修订的调用保持原语义,Ownership 文件发布和协议清理须满足其修订条件。
39
+
40
+ Ownership 2.1 的 `default/sub_aids/{sub_aid}/owner.md` 必须公开可读,只有命名空间所属 owner 可修改、删除;该限制覆盖 ACL、token、父目录、移动、重命名、软链、挂载及自动清理,不能由通用权限顺序放宽。关系释放仍以 NS 验收为准;完整规则见 [Ownership 协议定义 2.1](Ownership协议定义2.1.md)。
41
+
34
42
  ### `storage.put_object`
35
43
 
36
44
  内联写入小对象(≤ 内联上限)。
@@ -47,6 +55,7 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
47
55
  | `is_private` | boolean | ❌ | 默认 `true`,公开对象可被其他 AID 读取 |
48
56
  | `overwrite` | boolean | ❌ | 默认 `true`,`false` 时对象已存在则拒绝 |
49
57
  | `expected_version` | integer | ❌ | CAS 并发控制,版本不匹配则拒绝 |
58
+ | `expected_revision` | string | ❌ | 原权威路径修订;Ownership 发布须携带 |
50
59
  | `expire_in_seconds` | integer | ❌ | 过期时间,`0` 表示永不过期 |
51
60
  | `metadata` | object | ❌ | 用户自定义元数据 |
52
61
 
@@ -67,9 +76,13 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
67
76
  | `owner_aid` | string | ❌ | 默认调用者 AID |
68
77
  | `bucket` | string | ❌ | 默认 `"default"` |
69
78
  | `object_key` | string | ✅ | 对象路径 |
79
+ | `consistency` | string | ❌ | 传 `authoritative` 时绕过缓存并返回完整权威对象 |
80
+ | `expected_revision` | string | ❌ | 条件读取使用的原权威路径修订 |
70
81
 
71
82
  **响应**:`{ owner_aid, bucket, object_key, content (base64), content_type, size_bytes, sha256, version, updated_at }`
72
83
 
84
+ 可选 `consistency: authoritative` 返回本节定义的权威对象结果;权威 get 要求完整对象,不接受范围读取。
85
+
73
86
  **权限**:私有对象仅所有者可读;公开对象(`is_private=false`)任何 AID 可读。
74
87
 
75
88
  ### `storage.head_object`
@@ -80,15 +93,17 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
80
93
 
81
94
  **响应**:`{ owner_aid, bucket, object_key, content_type, size_bytes, sha256, version, etag, is_private, expire_at, created_at, updated_at }`
82
95
 
96
+ 可选 `consistency: authoritative` 返回本节定义的权威对象结果,包括明确不存在与路径修订。
97
+
83
98
  **权限**:同 `get_object`。
84
99
 
85
100
  ### `storage.delete_object`
86
101
 
87
102
  删除单个对象。
88
103
 
89
- **参数**:同 `get_object`。
104
+ **参数**:对象寻址同 `get_object`,可附 `expected_revision` 作条件删除。
90
105
 
91
- **响应**:`{ deleted (bool), owner_aid, object_key }`
106
+ **响应**:`{ deleted (bool), owner_aid, object_key }`;条件删除附新路径 `revision`。
92
107
 
93
108
  **权限**:仅所有者可删。
94
109
 
@@ -130,7 +145,7 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
130
145
 
131
146
  **权限**:仅所有者可列。
132
147
 
133
- ### `storage.get_quota`
148
+ ### `storage.get_quota`
134
149
 
135
150
  查询存储配额使用情况。
136
151
 
@@ -142,30 +157,7 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
142
157
 
143
158
  **响应**:`{ owner_aid, used_bytes, object_count, quota_bytes }`
144
159
 
145
- **权限**:仅所有者可查。
146
-
147
- ### `storage.relation_backup_provision`
148
-
149
- 由 Auth 服务在 external owner relation 激活或重建时内部调用,普通客户端不得调用。请求必须带 `_caller_id="auth"`,参数如下:
150
-
151
- | 参数 | 类型 | 必需 | 说明 |
152
- |------|------|:----:|------|
153
- | `owner_aid` | string | 是 | 外部 owner AID |
154
- | `subject_aid` | string | 是 | 被管理的 subject AID;与 owner 不同 |
155
- | `proof_id` | string | 是 | 当前 active ownership proof |
156
- | `relation_version` | integer | 是 | 当前关系版本,>=1 |
157
-
158
- 服务端在 owner 的 `default` bucket 创建或复用固定命名空间 `.aun/subjects/<lowercase_subject_aid>`,并写入 subject 的 `rw` ACL。成功响应包含 `schema=aun.relation-backup-namespace.v1`、`owner_aid`、`subject_aid`、`proof_id`、`relation_version`、`bucket=default`、`path`、`acl_source=ownership_relation`、`acl_generation`、`status=ready`、`on_revoke=retain_data_revoke_acl` 和 `data_retained=true`。首次 provision 的 `acl_generation` 为 1;同一 proof/version 重复调用幂等。
159
-
160
- ### `storage.relation_backup_revoke`
161
-
162
- 由 Auth 服务内部调用,参数为 `owner_aid`、`subject_aid` 和可选 `expected_relation_version`。服务端只移除 subject 的 relation ACL,不删除命名空间或其中数据,响应 `status=retained`、`data_retained=true`,并递增 `acl_generation`。记录不存在返回 `-32008`;Auth 之外的调用返回 `-32004`。
163
-
164
- ### `storage.relation_backup_status`
165
-
166
- 查询关系备份命名空间元数据,不返回目录内容。请求参数:`subject_aid` 必填,`owner_aid` 可选。调用者必须是 owner 或 subject;其它调用返回 `-32004`。未创建记录返回 `status=pending`、`acl_generation=0`、`data_retained=false`;已撤销记录返回 `status=retained`,数据仍保留。
167
-
168
- 关系备份目录的权限约束:subject 仅在关系 `ready` 时访问自己的 `.aun/subjects/<subject>/` 后代,不能枚举 `.aun/subjects/` 根或其它 subject 目录,不能删除自己的 subject 根目录,也不能修改 ACL、visibility、token、share 或 mount。owner 可读写目录数据,但不能通过普通 Storage RPC 修改关系 ACL。
160
+ **权限**:仅所有者可查。
169
161
 
170
162
  ---
171
163
 
@@ -187,6 +179,7 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
187
179
  | `size_bytes` | integer | ❌ | 预期大小(客户端追踪用) |
188
180
  | `content_type` | string | ❌ | 默认 `application/octet-stream` |
189
181
  | `expected_version` | integer | ❌ | CAS 版本检查(签 URL 前校验) |
182
+ | `expected_revision` | string | ❌ | 固定上传 session 的原权威路径修订,最终发布再次检查 |
190
183
  | `expire_in_seconds` | integer | ❌ | URL 有效期,默认 3600 秒 |
191
184
 
192
185
  **响应**:`{ upload_url, blob_key, expire_at, owner_aid, bucket, object_key, content_type, size_bytes }`
@@ -215,6 +208,8 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
215
208
  | `expire_in_seconds` | integer | ❌ | 过期时间,默认永不过期 |
216
209
  | `metadata` | object | ❌ | 用户自定义元数据 |
217
210
  | `expected_version` | integer | ❌ | CAS 并发控制 |
211
+ | `expected_revision` | string | ❌ | 原权威路径修订;使用条件 session 时须与 session 一致 |
212
+ | `session_id` | string | ❌ | create_upload_session 返回的条件上传 session |
218
213
 
219
214
  **响应**:`{ owner_aid, bucket, object_key, size_bytes, content_type, sha256, version, etag, updated_at }`
220
215
 
@@ -2,6 +2,10 @@
2
2
 
3
3
  版本: 1.0.0
4
4
 
5
+ 本文是 legacy Agent.md 1.0 历史副本,不定义当前尾部文件签名或 Ownership 2.1。当前文件容器、可扩展 type、AID 和 ownership 字段以 [Ownership 协议定义 2.1](../Ownership协议定义2.1.md) 为准;[Ownership 2.0 Schema](../../agent.md/SCHEMA.md) 也属于历史版本。
6
+
7
+ 当前 Group/Org 仅由专属生命周期的 owner 本人代签代上传,owner 必填而 ownership 可缺省,签名块必含 signer_aid;完整规则见 [当前协议 §2.5](../Ownership协议定义2.1.md#25-grouporg-名片的-owner-代签与上传),不采用本历史副本的签名方式。
8
+
5
9
  ## 限制
6
10
 
7
11
  - **文件大小**: 最大 4KB
@@ -139,7 +139,7 @@ await client.connect({
139
139
  | `short_ttl_ms` | 短连接服务端兜底超时 |
140
140
  | `delivery_mode` | 连接级投递语义 |
141
141
  | `extra_info` | 应用层自定义连接信息;下划线开头的键不会透传给 Gateway |
142
- | `background_sync` | 连接成功后是否执行 SDK 后台补洞 / 未读同步,默认开启 |
142
+ | `background_sync` | 连接成功后是否执行消息后台补洞 / 未读同步,默认开启;不关闭已读状态查询补偿 |
143
143
  | `auto_reconnect` | 断线后是否自动重连 |
144
144
  | `heartbeat_interval` | 心跳间隔,秒 |
145
145
  | `retry.initial_delay` / `retry.max_delay` | 退避重连参数 |
@@ -210,13 +210,16 @@ print(client.can_connect, client.can_send, client.is_online)
210
210
  | `group.changed` | 群组事件 |
211
211
  | `message.undecryptable` / `group.message_undecryptable` | E2EE 解密失败 |
212
212
  | `delivery.changed` | SDK 本地批量交付完成通知,用于合并 UI 刷新(完整契约见 [06-API手册](06-API手册.md#deliverychanged)) |
213
+ | `read_state_sync` | SDK 本地已读状态补偿完成,含本轮 `owner_aid`、`states` 和逐项 `errors`;连接返回不代表补偿完成 |
213
214
 
214
- 建议在 `connect()` 前注册事件处理器。
215
+ 建议在 `connect()` 前注册事件处理器。`read_state_sync` 只交付本轮成功查询涉及的去重状态及逐项错误,空查询不夹带旧缓存。AID/device 切换按身份代际隔离缓存、登记及补偿完成事件,A→B→A 也不能接受旧代际结果;原在途 RPC 仍可返回。
215
216
 
216
217
  ---
217
218
 
218
219
  ## Agent Web / agent.md
219
220
 
221
+ 以下普通主体示例以本 AID 签名和 token 上传。Group/Org 使用专属 owner 生命周期:owner 与 entity_cert_fingerprint 必填、可无 ownership;仅当前 owner 用本人证书和私钥尾签(signer_aid=owner)并携带 V2 owner 授权,实体自身 token 不授予名片上传权。上传与恢复新鲜核对 owner/状态及实体证书代际,格式见 [Ownership 协议 §2.5](../protocol/Ownership协议定义2.1.md#25-grouporg-名片的-owner-代签与上传)。
222
+
220
223
  发布自己的 agent.md:
221
224
 
222
225
  ```python