@agentunion/fastaun-browser 0.5.18 → 0.5.20
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.
- package/CHANGELOG.md +172 -79
- package/_packed_docs/CHANGELOG.md +172 -79
- package/_packed_docs/INDEX.md +244 -116
- package/_packed_docs/KITE_DOCS_GUIDE.md +98 -69
- package/_packed_docs/agent.md/SCHEMA.md +245 -205
- 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 +11 -11
- 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
- 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
- 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
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +1072 -1072
- 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
- package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +687 -668
- package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +19 -28
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/211.md +443 -0
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.0.md +161 -0
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.1.md +658 -0
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2113.0.md +233 -0
- package/_packed_docs/protocol/agent.md/SCHEMA.md +4 -0
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +1 -1
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +68 -61
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +1 -1
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +279 -285
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +3 -3
- package/_packed_docs/sdk/09-group-rpc-manual.md +271 -235
- package/_packed_docs/sdk/09-message-rpc-manual.md +47 -6
- package/_packed_docs/sdk/09-storage-rpc-manual.md +70 -68
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +63 -34
- package/_packed_docs/sdk/INDEX.md +105 -34
- package/_packed_docs/sdk/Ownership-SDK/345/256/236/347/216/260/346/214/207/345/215/227.md +169 -0
- package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/227.md +349 -0
- package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/2272.1.md +922 -0
- package/_packed_docs/sdk/Ownership-SDK/351/233/206/346/210/220/346/214/207/345/215/227.md +270 -0
- package/_packed_docs/sdk/Ownership2.1-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +300 -0
- package/_packed_docs/sdk/Ownership2.1-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +382 -0
- package/_packed_docs/sdk/Ownership2.1-TDD/345/210/206/351/230/266/346/256/265/345/256/236/346/226/275/350/256/241/345/210/222.md +708 -0
- package/_packed_docs/sdk/Ownership2.1/350/257/246/347/273/206/350/256/276/350/256/241.md +476 -0
- package/_packed_docs/sdk/Ownership/347/256/241/347/220/206/344/270/223/351/242/230.md +559 -0
- package/_packed_docs/sdk/ProtectedHeaders/347/224/250/346/263/225/344/270/223/351/242/230.md +299 -0
- package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +173 -0
- package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +211 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273SDK/345/256/236/347/216/260/347/247/273/346/244/215/346/214/207/345/215/227.md +331 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273SDK/351/233/206/346/210/220/346/214/207/345/215/227.md +207 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/344/273/243/347/240/201/345/256/241/346/237/245/346/212/245/345/221/212.md +252 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/345/256/236/346/226/275/350/256/241/345/210/222.md +156 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/346/226/271/346/241/210.md +273 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/350/257/246/347/273/206/350/256/276/350/256/241.md +211 -0
- package/dist/agent-md-schema.d.ts +17 -3
- package/dist/agent-md-schema.d.ts.map +1 -1
- package/dist/agent-md-schema.js +94 -26
- package/dist/agent-md-schema.js.map +1 -1
- package/dist/agent-md.d.ts +54 -3
- package/dist/agent-md.d.ts.map +1 -1
- package/dist/agent-md.js +711 -65
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +58 -46
- package/dist/aid-store.d.ts.map +1 -1
- package/dist/aid-store.js +254 -248
- package/dist/aid-store.js.map +1 -1
- package/dist/aid.d.ts +4 -1
- package/dist/aid.d.ts.map +1 -1
- package/dist/aid.js +27 -33
- package/dist/aid.js.map +1 -1
- package/dist/auth.d.ts +4 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +426 -39
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +38179 -32054
- package/dist/cert-utils.d.ts +50 -2
- package/dist/cert-utils.d.ts.map +1 -1
- package/dist/cert-utils.js +105 -47
- package/dist/cert-utils.js.map +1 -1
- package/dist/client/delivery.d.ts +22 -1
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js +389 -78
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts.map +1 -1
- package/dist/client/rpc-pipeline.js +103 -77
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts +1 -0
- package/dist/client/v2-e2ee.d.ts.map +1 -1
- package/dist/client/v2-e2ee.js +182 -89
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +100 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1220 -25
- package/dist/client.js.map +1 -1
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +8 -6
- package/dist/crypto.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +3 -2
- package/dist/errors.js.map +1 -1
- package/dist/events.d.ts +9 -2
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +72 -13
- package/dist/events.js.map +1 -1
- package/dist/facades.d.ts +82 -2
- package/dist/facades.d.ts.map +1 -1
- package/dist/facades.js +100 -6
- package/dist/facades.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/keystore/index.d.ts +17 -0
- package/dist/keystore/index.d.ts.map +1 -1
- package/dist/keystore/indexeddb-shared.d.ts +10 -1
- package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
- package/dist/keystore/indexeddb-shared.js +111 -0
- package/dist/keystore/indexeddb-shared.js.map +1 -1
- package/dist/keystore/indexeddb-token-store.d.ts +7 -1
- package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
- package/dist/keystore/indexeddb-token-store.js +30 -1
- package/dist/keystore/indexeddb-token-store.js.map +1 -1
- package/dist/org-protocol.d.ts +98 -0
- package/dist/org-protocol.d.ts.map +1 -0
- package/dist/org-protocol.js +1802 -0
- package/dist/org-protocol.js.map +1 -0
- package/dist/ownership-proof.d.ts +93 -5
- package/dist/ownership-proof.d.ts.map +1 -1
- package/dist/ownership-proof.js +239 -53
- package/dist/ownership-proof.js.map +1 -1
- package/dist/ownership-v21.d.ts +194 -0
- package/dist/ownership-v21.d.ts.map +1 -0
- package/dist/ownership-v21.js +678 -0
- package/dist/ownership-v21.js.map +1 -0
- package/dist/ownership-workflow.d.ts +151 -0
- package/dist/ownership-workflow.d.ts.map +1 -0
- package/dist/ownership-workflow.js +1229 -0
- package/dist/ownership-workflow.js.map +1 -0
- package/dist/seq-tracker.d.ts +1 -0
- package/dist/seq-tracker.d.ts.map +1 -1
- package/dist/seq-tracker.js +10 -2
- package/dist/seq-tracker.js.map +1 -1
- package/dist/tools/cross-sdk-agent.d.ts +83 -0
- package/dist/tools/cross-sdk-agent.d.ts.map +1 -1
- package/dist/tools/cross-sdk-agent.js +415 -7
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.d.ts +7 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +90 -2
- package/dist/transport.js.map +1 -1
- package/dist/v2/e2ee/decrypt.d.ts +1 -0
- package/dist/v2/e2ee/decrypt.d.ts.map +1 -1
- package/dist/v2/e2ee/decrypt.js +9 -1
- package/dist/v2/e2ee/decrypt.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -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`、`owner_aid`、`bucket`、规范 `path` 和 Unix 秒 `observed_at`;存在时附摘要及现有对象元数据,get 返回完整严格 Base64 `content`。故障、权限错误和恢复未完成不得返回 `exists=false`;下载或网关 404 不能证明权威不存在。
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
规范 `default/agent.md` 与 `default/sub_aids/{sub_aid}/owner.md` 的上传会话使用独立临时对象,`create_upload_session` 返回 `session_id`;新客户端完成这些规范文件时必须携带同一 `session_id`。服务端核对会话的认证申请者、目标及有效期,验证完整内容后原子发布,失败保留旧完整文件。普通对象保持既有上传流程,不保证返回 `session_id`;该临时会话不记录 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
|
内联写入小对象(≤ 内联上限)。
|
|
@@ -67,9 +75,12 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
|
|
|
67
75
|
| `owner_aid` | string | ❌ | 默认调用者 AID |
|
|
68
76
|
| `bucket` | string | ❌ | 默认 `"default"` |
|
|
69
77
|
| `object_key` | string | ✅ | 对象路径 |
|
|
78
|
+
| `consistency` | string | ❌ | 传 `authoritative` 时绕过缓存并返回完整权威对象 |
|
|
70
79
|
|
|
71
80
|
**响应**:`{ owner_aid, bucket, object_key, content (base64), content_type, size_bytes, sha256, version, updated_at }`
|
|
72
81
|
|
|
82
|
+
可选 `consistency: authoritative` 返回本节定义的权威对象结果;权威 get 要求完整对象,不接受范围读取。
|
|
83
|
+
|
|
73
84
|
**权限**:私有对象仅所有者可读;公开对象(`is_private=false`)任何 AID 可读。
|
|
74
85
|
|
|
75
86
|
### `storage.head_object`
|
|
@@ -80,15 +91,17 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
|
|
|
80
91
|
|
|
81
92
|
**响应**:`{ owner_aid, bucket, object_key, content_type, size_bytes, sha256, version, etag, is_private, expire_at, created_at, updated_at }`
|
|
82
93
|
|
|
94
|
+
可选 `consistency: authoritative` 返回本节定义的权威对象结果,包括明确当前不存在。
|
|
95
|
+
|
|
83
96
|
**权限**:同 `get_object`。
|
|
84
97
|
|
|
85
98
|
### `storage.delete_object`
|
|
86
99
|
|
|
87
100
|
删除单个对象。
|
|
88
101
|
|
|
89
|
-
|
|
102
|
+
**参数**:对象寻址同 `get_object`。
|
|
90
103
|
|
|
91
|
-
**响应**:`{ deleted (bool), owner_aid, object_key }
|
|
104
|
+
**响应**:`{ deleted (bool), owner_aid, object_key }`。
|
|
92
105
|
|
|
93
106
|
**权限**:仅所有者可删。
|
|
94
107
|
|
|
@@ -130,7 +143,7 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
|
|
|
130
143
|
|
|
131
144
|
**权限**:仅所有者可列。
|
|
132
145
|
|
|
133
|
-
### `storage.get_quota`
|
|
146
|
+
### `storage.get_quota`
|
|
134
147
|
|
|
135
148
|
查询存储配额使用情况。
|
|
136
149
|
|
|
@@ -142,30 +155,7 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
|
|
|
142
155
|
|
|
143
156
|
**响应**:`{ owner_aid, used_bytes, object_count, quota_bytes }`
|
|
144
157
|
|
|
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。
|
|
158
|
+
**权限**:仅所有者可查。
|
|
169
159
|
|
|
170
160
|
---
|
|
171
161
|
|
|
@@ -214,7 +204,8 @@ Storage 服务是 AUN 协议的应用层扩展,提供对象存储能力。负
|
|
|
214
204
|
| `size_bytes` | integer | ❌ | 期望大小,服务端校验 |
|
|
215
205
|
| `expire_in_seconds` | integer | ❌ | 过期时间,默认永不过期 |
|
|
216
206
|
| `metadata` | object | ❌ | 用户自定义元数据 |
|
|
217
|
-
| `expected_version` | integer | ❌ | CAS 并发控制 |
|
|
207
|
+
| `expected_version` | integer | ❌ | CAS 并发控制 |
|
|
208
|
+
| `session_id` | string | ❌ | 规范 agent.md/owner.md 新上传必须沿用 create_upload_session 返回的同一会话 |
|
|
218
209
|
|
|
219
210
|
**响应**:`{ owner_aid, bucket, object_key, size_bytes, content_type, sha256, version, etag, updated_at }`
|
|
220
211
|
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
# Ownership 协议定义
|
|
2
|
+
|
|
3
|
+
本文定义当前四端 SDK 使用的 ownership wire 协议、`agent.md` ownership 字段、identity escrow 封套、owner 代上传授权和现有 RPC 边界。协议版本以当前实现中的 `aun.ownership.v1` 为准;`v1` 是消息类型版本,关系声明本身使用 `version: 2`。
|
|
4
|
+
|
|
5
|
+
这里的声明 `version: 2` 不等于 [Ownership协议定义2.0](Ownership协议定义2.0.md)。工作区的 [agent.md SCHEMA](../agent.md/SCHEMA.md) 已采用该另一套文档声明契约;本文件中的 `ownership_proof`、托管、代上传与 release 以当前四 SDK 和 Name Service 代码为准。
|
|
6
|
+
|
|
7
|
+
ownership 是 `subject_aid` 与 `owner_aid` 之间的双方签名关系。关系编排由 SDK 完成,服务端不建立 ownership 专用状态机。消息、Storage、Name Service、Auth/CA 仍使用各自已有接口。
|
|
8
|
+
|
|
9
|
+
## 1. 标识与不变量
|
|
10
|
+
|
|
11
|
+
| 名称 | 定义 |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| `subject_aid` | 被管理的 AID;其 `agent.md` 由 subject 签名,完整关系下可由 owner 代上传 |
|
|
14
|
+
| `owner_aid` | 管理 subject 的 AID |
|
|
15
|
+
| `proof_id` | 小写 UUID v4;同一关系的双方声明、`agent.md` proof 和控制消息必须一致 |
|
|
16
|
+
| `request_id` | 一次绑定或释放编排的消息关联 ID;非空,释放请求使用独立 ID |
|
|
17
|
+
| `subject_type` / `type` | subject 的应用类型,默认 `agent`;SDK 不解释 `extensions` 中的业务字段 |
|
|
18
|
+
| `extensions` | 每个签署者自己的声明扩展;双方不要求内容相同 |
|
|
19
|
+
|
|
20
|
+
所有 AID 在 wire 上使用小写规范形式。控制消息必须由 SDK 通过加密 P2P 发送;应用层接收到的是 SDK 产生的 `ownership.request`,不直接处理控制 payload。
|
|
21
|
+
|
|
22
|
+
## 2. Ownership P2P 消息 schema
|
|
23
|
+
|
|
24
|
+
### 2.1 公共 payload
|
|
25
|
+
|
|
26
|
+
每个控制消息作为 `message.send.params.payload` 传送:
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"type": "aun.ownership.v1",
|
|
31
|
+
"action": "bind.request",
|
|
32
|
+
"request_id": "request-20261009-001",
|
|
33
|
+
"proof_id": "550e8400-e29b-41d4-a716-446655440000",
|
|
34
|
+
"subject_aid": "subject.agentid.pub",
|
|
35
|
+
"owner_aid": "owner.agentid.pub"
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
公共字段:
|
|
40
|
+
|
|
41
|
+
| 字段 | 类型 | 必填 | 约束 |
|
|
42
|
+
| --- | --- | --- | --- |
|
|
43
|
+
| `type` | string | 是 | 固定为 `aun.ownership.v1` |
|
|
44
|
+
| `action` | string | 是 | `bind.request`、`bind.response`、`bind.reject`、`escrow.ready`、`agent_md.updated` 或 `release.request` |
|
|
45
|
+
| `request_id` | string | 是 | 去除首尾空白后非空;绑定后续消息必须匹配本地关系记录 |
|
|
46
|
+
| `proof_id` | string | 是 | 小写 UUID v4 |
|
|
47
|
+
| `subject_aid` | string | 是 | 小写、有效 AID |
|
|
48
|
+
| `owner_aid` | string | 是 | 小写、有效 AID |
|
|
49
|
+
| `subject_type` | string | 条件 | 绑定申请和响应中保存的 subject 类型 |
|
|
50
|
+
|
|
51
|
+
`message.send` 的发送方必须是关系中的一方,接收 SDK 根据已确认的消息 sender 与 payload 中的 AID 交叉校验。未知 action、缺少公共字段、sender 不匹配或校验失败的 payload 仍由 SDK 消费,不作为普通应用消息投递。
|
|
52
|
+
|
|
53
|
+
### 2.2 action 字段
|
|
54
|
+
|
|
55
|
+
| action | 方向 | 附加必填字段 | 处理结果 |
|
|
56
|
+
| --- | --- | --- | --- |
|
|
57
|
+
| `bind.request` | 发起方 → 对端 | `statement`、`signature` | 接收方保存单方声明并发布本地 `ownership.request` |
|
|
58
|
+
| `bind.response` | 审批方 → 发起方 | `statement`、`signature` | 合并对端声明;双方签名齐全后本地状态为 `active` |
|
|
59
|
+
| `bind.reject` | 审批方 → 发起方 | 无 | 关系记录为 `rejected`,不启动 escrow 或代上传 |
|
|
60
|
+
| `escrow.ready` | subject → owner | `escrow_path`、`escrow_download_url`、`escrow_password`、`escrow_sha256` | owner 下载并导入 subject identity,随后代上传 `agent.md` |
|
|
61
|
+
| `agent_md.updated` | owner → subject | 无 | subject 下载、验签并同步 owner 已上传的 `agent.md` |
|
|
62
|
+
| `release.request` | 原 owner → subject | `ownership_release` | subject 验证原关系后进入 rekey 和无 owner 名片上传 |
|
|
63
|
+
|
|
64
|
+
绑定请求和响应中的 `statement`/`signature` 是当前消息发送者自己的声明。`bind.reject` 不携带新的签名声明,但必须匹配待审批的 `request_id`、`proof_id` 和双方 AID。`escrow.ready` 中的密码只在加密 P2P 中传送,不能写入公开日志或公开状态。
|
|
65
|
+
|
|
66
|
+
双方签名完成即成立关系。subject 立即自行发布包含完整 proof 的 `agent.md`,随后独立尝试 identity 托管;发布或托管失败均不撤销关系,发布失败不阻止托管。owner 代上传须等 subject identity 已导入其持久化身份存储。
|
|
67
|
+
|
|
68
|
+
### 2.3 示例 payload
|
|
69
|
+
|
|
70
|
+
绑定申请和响应使用同一结构,只有签署角色和声明内容不同:
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"type": "aun.ownership.v1",
|
|
75
|
+
"action": "bind.request",
|
|
76
|
+
"request_id": "request-20261009-001",
|
|
77
|
+
"proof_id": "550e8400-e29b-41d4-a716-446655440000",
|
|
78
|
+
"subject_aid": "subject.agentid.pub",
|
|
79
|
+
"owner_aid": "owner.agentid.pub",
|
|
80
|
+
"subject_type": "agent",
|
|
81
|
+
"statement": {
|
|
82
|
+
"version": 2,
|
|
83
|
+
"proof_id": "550e8400-e29b-41d4-a716-446655440000",
|
|
84
|
+
"subject_aid": "subject.agentid.pub",
|
|
85
|
+
"owner_aid": "owner.agentid.pub",
|
|
86
|
+
"signer_aid": "owner.agentid.pub",
|
|
87
|
+
"role": "owner",
|
|
88
|
+
"signed_at": 1791523200,
|
|
89
|
+
"extensions": {"department": "clinic"}
|
|
90
|
+
},
|
|
91
|
+
"signature": {
|
|
92
|
+
"cert_fingerprint": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
93
|
+
"signature": "BASE64_DER_ECDSA_SIGNATURE",
|
|
94
|
+
"signer_aid": "owner.agentid.pub",
|
|
95
|
+
"role": "owner",
|
|
96
|
+
"statement": {
|
|
97
|
+
"version": 2,
|
|
98
|
+
"proof_id": "550e8400-e29b-41d4-a716-446655440000",
|
|
99
|
+
"subject_aid": "subject.agentid.pub",
|
|
100
|
+
"owner_aid": "owner.agentid.pub",
|
|
101
|
+
"signer_aid": "owner.agentid.pub",
|
|
102
|
+
"role": "owner",
|
|
103
|
+
"signed_at": 1791523200,
|
|
104
|
+
"extensions": {"department": "clinic"}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"type": "aun.ownership.v1",
|
|
113
|
+
"action": "escrow.ready",
|
|
114
|
+
"request_id": "request-20261009-001",
|
|
115
|
+
"proof_id": "550e8400-e29b-41d4-a716-446655440000",
|
|
116
|
+
"subject_aid": "subject.agentid.pub",
|
|
117
|
+
"owner_aid": "owner.agentid.pub",
|
|
118
|
+
"subject_type": "agent",
|
|
119
|
+
"escrow_path": "/.aun/ownership/subject.agentid.pub/550e8400-e29b-41d4-a716-446655440000.json",
|
|
120
|
+
"escrow_download_url": "https://storage.agentid.pub/download/opaque-ticket",
|
|
121
|
+
"escrow_password": "BASE64URL_RANDOM_PASSWORD",
|
|
122
|
+
"escrow_sha256": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"type": "aun.ownership.v1",
|
|
129
|
+
"action": "release.request",
|
|
130
|
+
"request_id": "release-20261009-001",
|
|
131
|
+
"proof_id": "550e8400-e29b-41d4-a716-446655440000",
|
|
132
|
+
"subject_aid": "subject.agentid.pub",
|
|
133
|
+
"owner_aid": "owner.agentid.pub",
|
|
134
|
+
"ownership_release": {
|
|
135
|
+
"cert_fingerprint": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
136
|
+
"signature": "BASE64_DER_ECDSA_RELEASE_SIGNATURE",
|
|
137
|
+
"signer_aid": "owner.agentid.pub",
|
|
138
|
+
"role": "owner",
|
|
139
|
+
"statement": {
|
|
140
|
+
"version": 1,
|
|
141
|
+
"action": "release",
|
|
142
|
+
"proof_id": "550e8400-e29b-41d4-a716-446655440000",
|
|
143
|
+
"subject_aid": "subject.agentid.pub",
|
|
144
|
+
"owner_aid": "owner.agentid.pub",
|
|
145
|
+
"signer_aid": "owner.agentid.pub",
|
|
146
|
+
"role": "owner",
|
|
147
|
+
"signed_at": 1791523260
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## 3. Ownership proof 与签名封套
|
|
154
|
+
|
|
155
|
+
### 3.1 v2 声明
|
|
156
|
+
|
|
157
|
+
关系声明的 wire schema 为:
|
|
158
|
+
|
|
159
|
+
```json
|
|
160
|
+
{
|
|
161
|
+
"version": 2,
|
|
162
|
+
"proof_id": "uuid-v4-lowercase",
|
|
163
|
+
"subject_aid": "subject.agentid.pub",
|
|
164
|
+
"owner_aid": "owner.agentid.pub",
|
|
165
|
+
"signer_aid": "owner.agentid.pub",
|
|
166
|
+
"role": "owner",
|
|
167
|
+
"signed_at": 1791523200,
|
|
168
|
+
"extensions": {"application": "clinic-app"}
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
| 字段 | 类型 | 约束 |
|
|
173
|
+
| --- | --- | --- |
|
|
174
|
+
| `version` | integer | 固定为 `2` |
|
|
175
|
+
| `proof_id` | string | 小写 UUID v4 |
|
|
176
|
+
| `subject_aid`、`owner_aid` | string | 有效的小写 AID |
|
|
177
|
+
| `signer_aid` | string | `role=subject` 时等于 `subject_aid`;`role=owner` 时等于 `owner_aid` |
|
|
178
|
+
| `role` | string | 只能是 `subject` 或 `owner` |
|
|
179
|
+
| `signed_at` | integer | Unix 秒,正整数;签署时必须落在证书有效期内 |
|
|
180
|
+
| `extensions` | object | 可选;必须是对象,按原样进入该签署者的声明 |
|
|
181
|
+
|
|
182
|
+
每个签署者独立生成声明。双方必须共享 `proof_id`、`subject_aid` 和 `owner_aid`,但 `signed_at` 和 `extensions` 可以不同。
|
|
183
|
+
|
|
184
|
+
### 3.2 签名封套
|
|
185
|
+
|
|
186
|
+
```json
|
|
187
|
+
{
|
|
188
|
+
"cert_fingerprint": "sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
|
|
189
|
+
"signature": "BASE64_STRICT_DER_ECDSA_SIGNATURE",
|
|
190
|
+
"signer_aid": "owner.agentid.pub",
|
|
191
|
+
"role": "owner",
|
|
192
|
+
"statement": {"version": 2, "proof_id": "...", "subject_aid": "...", "owner_aid": "...", "signer_aid": "...", "role": "owner", "signed_at": 1791523200}
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
`cert_fingerprint` 必须匹配 `sha256:<64 个十六进制字符>`;`signature` 是 ECDSA P-256/SHA-256 DER 签名的严格 Base64。封套中的 `signer_aid`、`role` 和嵌套 `statement` 若存在,必须与外部声明一致;实现应保存实际签署的 statement,不能根据当前时间或默认扩展重新构造历史签名。
|
|
197
|
+
|
|
198
|
+
签名字节严格定义为:
|
|
199
|
+
|
|
200
|
+
```text
|
|
201
|
+
UTF-8("AUN-AID-OWNER-RELATION-V1;") || canonical_json(statement)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
`canonical_json` 使用 UTF-8、递归字典序键、无空格和稳定数字/转义编码。前缀末尾的可见分号是签名域的一部分。验证时按 AID 和指纹解析证书,检查证书 CN、指纹、角色和签署时间,再验证签名;下载历史名片不要求签名证书当前仍是 `active_signing`,上传时则要求相关证书当前为 `active_signing`。
|
|
205
|
+
|
|
206
|
+
### 3.3 `ownership_proof` 对象
|
|
207
|
+
|
|
208
|
+
```yaml
|
|
209
|
+
ownership_proof:
|
|
210
|
+
proof_id: 550e8400-e29b-41d4-a716-446655440000
|
|
211
|
+
subject_aid: subject.agentid.pub
|
|
212
|
+
owner_aid: owner.agentid.pub
|
|
213
|
+
subject_signature: <signature envelope for role=subject>
|
|
214
|
+
owner_signature: <signature envelope for role=owner>
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
外部 owner 关系必须有 `subject_signature` 和 `owner_signature`。self-owner(`subject_aid == owner_aid`)只保留 `subject_signature`,必须省略 `owner_signature`。仅有 `subject_aid`/`owner_aid` 的不完整 proof 可由 subject 自行上传,但不能授权 owner 代上传。
|
|
218
|
+
|
|
219
|
+
### 3.4 释放声明
|
|
220
|
+
|
|
221
|
+
释放声明使用独立签名域:
|
|
222
|
+
|
|
223
|
+
```text
|
|
224
|
+
UTF-8("AUN-AID-OWNER-RELEASE-V1;") || canonical_json(statement)
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
其 statement 只允许以下字段:`version: 1`、`action: "release"`、`proof_id`、`subject_aid`、`owner_aid`、`signer_aid`、`role: "owner"`、正整数 `signed_at`。释放封套沿用 `cert_fingerprint`、`signature`、`signer_aid`、`role`、`statement` 字段。Name Service 将 release 的三元组与已保存的 ownership 关系匹配,匹配后才接受清除 owner 的名片。
|
|
228
|
+
|
|
229
|
+
## 4. agent.md ownership 字段与状态
|
|
230
|
+
|
|
231
|
+
### 4.1 frontmatter 约束
|
|
232
|
+
|
|
233
|
+
其它基础字段(`aid`、`name`、`type`、`version`、正文和尾部 AUN 签名)遵循 [agent.md Schema](../agent.md/SCHEMA.md)。ownership 只增加以下字段:
|
|
234
|
+
|
|
235
|
+
```yaml
|
|
236
|
+
aid: subject.agentid.pub
|
|
237
|
+
name: Subject
|
|
238
|
+
type: agent
|
|
239
|
+
version: 1.0.0
|
|
240
|
+
owner: owner.agentid.pub
|
|
241
|
+
ownership_proof:
|
|
242
|
+
proof_id: 550e8400-e29b-41d4-a716-446655440000
|
|
243
|
+
subject_aid: subject.agentid.pub
|
|
244
|
+
owner_aid: owner.agentid.pub
|
|
245
|
+
subject_signature: {...}
|
|
246
|
+
owner_signature: {...}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
校验规则:
|
|
250
|
+
|
|
251
|
+
1. `owner` 与 `ownership_proof.owner_aid` 必须是同一个小写 AID;`ownership_proof.subject_aid` 必须等于 frontmatter 的 `aid`。
|
|
252
|
+
2. `ownership_proof` 出现时必须同时有 `owner`;`human` 类型不能携带 `owner` 或 proof。
|
|
253
|
+
3. self-owner 不能出现 `owner_signature`。
|
|
254
|
+
4. `ownership_release` 出现时必须同时省略 `owner` 和 `ownership_proof`;`human` 不能携带 release。
|
|
255
|
+
5. proof 中已出现的每个签名都必须结构合法并能独立验签;缺少 owner 签名只表示 `incomplete`,不表示 owner 已授权。
|
|
256
|
+
|
|
257
|
+
### 4.2 文件级 ownership 状态
|
|
258
|
+
|
|
259
|
+
SDK 分别返回文件签名状态和 ownership 状态。ownership 状态定义如下:
|
|
260
|
+
|
|
261
|
+
| 状态 | 条件 |
|
|
262
|
+
| --- | --- |
|
|
263
|
+
| `unbound` | 没有 `owner`、proof 或 release |
|
|
264
|
+
| `incomplete` | 有 owner 或单方 proof,但外部关系尚未形成完整双方签名 |
|
|
265
|
+
| `complete` | 外部关系双方签名均有效,或 self-owner 的 subject 单签有效 |
|
|
266
|
+
| `released` | 有效 `ownership_release`,且 owner/proof 已移除 |
|
|
267
|
+
| `invalid` | 字段、关系、证书、签名或时间校验失败 |
|
|
268
|
+
|
|
269
|
+
subject 自行上传不完整 proof 是允许的;owner 代上传和完整关系发布必须达到 `complete`。文件尾部主体签名始终由 subject 签署,owner 代上传只改变 HTTP 上传授权者。
|
|
270
|
+
|
|
271
|
+
## 5. Identity escrow 封套
|
|
272
|
+
|
|
273
|
+
### 5.1 对象与明文包
|
|
274
|
+
|
|
275
|
+
subject 将 identity 包序列化为 UTF-8 JSON 后加密。当前实现要求至少包含:
|
|
276
|
+
|
|
277
|
+
```json
|
|
278
|
+
{
|
|
279
|
+
"aid": "subject.agentid.pub",
|
|
280
|
+
"private_key_pem": "-----BEGIN PRIVATE KEY-----...",
|
|
281
|
+
"public_key_der_b64": "BASE64_DER_PUBLIC_KEY",
|
|
282
|
+
"curve": "P-256",
|
|
283
|
+
"cert": "-----BEGIN CERTIFICATE-----..."
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
明文包包含私钥,只能经加密 P2P 交给 owner;owner 导入既有 AIDStore/IndexedDB identity store 后才用于 subject 签名。运行时缓存字段不作为公开 ownership 状态返回。
|
|
288
|
+
|
|
289
|
+
### 5.2 加密封套 schema
|
|
290
|
+
|
|
291
|
+
```json
|
|
292
|
+
{
|
|
293
|
+
"version": 1,
|
|
294
|
+
"alg": "AES-256-GCM",
|
|
295
|
+
"kdf": "PBKDF2-SHA256",
|
|
296
|
+
"iterations": 200000,
|
|
297
|
+
"salt": "BASE64_16_BYTES",
|
|
298
|
+
"nonce": "BASE64_12_BYTES",
|
|
299
|
+
"ciphertext": "BASE64_CIPHERTEXT_AND_16_BYTE_TAG",
|
|
300
|
+
"sha256": "LOWERCASE_SHA256_OF_PLAINTEXT"
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
固定参数为 AES-256-GCM、PBKDF2-SHA256 200000 次、16 字节 salt、12 字节 nonce、AAD `AUN-CERT-ESCROW-V1`。`ciphertext` 包含 GCM 认证 tag;`sha256` 校验解密后的明文。四端必须按相同字节规则序列化和解密,密码不写入 Storage 对象。
|
|
305
|
+
|
|
306
|
+
对象路径固定为:
|
|
307
|
+
|
|
308
|
+
```text
|
|
309
|
+
/.aun/ownership/<lowercase_subject_aid>/<proof_id>.json
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
subject 在自己的 `default` bucket 写入对象,只向 `owner_aid` 授予该对象 `r` ACL,然后为 `viewer_aid=owner_aid` 申请下载票据。`escrow.ready` 传递路径、票据 URL、密码和明文摘要。
|
|
313
|
+
|
|
314
|
+
票据地址沿用 Storage 约定,按 `logical_url`、`download_url`、`url` 顺序选择。owner 解密并校验 identity 后须导入已有身份存储并持久化:文件型 SDK 使用 `{aunPath}/AIDs/{subjectAid}/private/key.json` 与 `public/cert.pem`,浏览器 SDK 使用 IndexedDB `aun-keystore` 的 `key_pairs`、`certs`。私钥沿用身份存储的本地 seed 加密,重启后可重新加载;关系 metadata 不保存明文私钥。
|
|
315
|
+
|
|
316
|
+
## 6. Owner 代上传授权
|
|
317
|
+
|
|
318
|
+
owner 使用 subject identity 签署完整 `agent.md`,再使用 owner identity 生成 HTTP 头:
|
|
319
|
+
|
|
320
|
+
```text
|
|
321
|
+
X-AUN-AgentMD-Owner-Authorization: <base64url(JSON)>
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
解码后的 JSON schema:
|
|
325
|
+
|
|
326
|
+
```json
|
|
327
|
+
{
|
|
328
|
+
"version": 1,
|
|
329
|
+
"target_aid": "subject.agentid.pub",
|
|
330
|
+
"uploader_aid": "owner.agentid.pub",
|
|
331
|
+
"body_sha256": "LOWERCASE_SHA256_OF_HTTP_BODY",
|
|
332
|
+
"timestamp": 1791523200,
|
|
333
|
+
"nonce": "32_HEX_CHARS",
|
|
334
|
+
"cert_fingerprint": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
335
|
+
"signature": "BASE64_STRICT_DER_ECDSA_SIGNATURE"
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
签名输入为:
|
|
340
|
+
|
|
341
|
+
```text
|
|
342
|
+
AUN-AGENT-MD-UPLOAD-V1;<uploader_aid>;<target_aid>;<body_sha256>;<timestamp>;<nonce>
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
字段和服务端校验要求:
|
|
346
|
+
|
|
347
|
+
- `target_aid` 必须等于请求 Host 对应的 subject AID;`uploader_aid` 必须等于 `agent.md.owner`。
|
|
348
|
+
- `body_sha256` 必须等于 HTTP 正文的 SHA-256;`timestamp` 与服务端时间偏差不能超过 300 秒。
|
|
349
|
+
- `nonce` 非空且长度不超过 128;当前 Name Service 不持久化 nonce,不能把 nonce 单独当作长期重放台账。
|
|
350
|
+
- owner 证书指纹、CN、AID、公钥和签名必须匹配,证书当前必须是 `active_signing`,签名算法为 ECDSA P-256/SHA-256。
|
|
351
|
+
- 代上传不能携带 owner bearer token 代替该授权头;subject 自行上传时使用现有 Bearer token,上传者 AID 必须等于 subject。
|
|
352
|
+
|
|
353
|
+
## 7. 现有 RPC 与 HTTP 接口边界
|
|
354
|
+
|
|
355
|
+
ownership 不新增 RPC。SDK 只组合已有能力:
|
|
356
|
+
|
|
357
|
+
### 7.1 `message.send`
|
|
358
|
+
|
|
359
|
+
```json
|
|
360
|
+
{
|
|
361
|
+
"to": "peer.agentid.pub",
|
|
362
|
+
"encrypt": true,
|
|
363
|
+
"payload": {
|
|
364
|
+
"type": "aun.ownership.v1",
|
|
365
|
+
"action": "bind.request",
|
|
366
|
+
"request_id": "...",
|
|
367
|
+
"proof_id": "...",
|
|
368
|
+
"subject_aid": "...",
|
|
369
|
+
"owner_aid": "..."
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
`to` 是对端 AID,`encrypt` 必须为 `true`。ownership 控制消息沿用持久 P2P 消息默认语义,不使用 volatile TTL。Message/Gateway 只转发加密 envelope,不解析 action 或 proof 业务字段。
|
|
375
|
+
|
|
376
|
+
### 7.2 Storage RPC
|
|
377
|
+
|
|
378
|
+
| 现有接口 | ownership 用途 | 关键参数边界 |
|
|
379
|
+
| --- | --- | --- |
|
|
380
|
+
| `storage.put_object`(或 SDK VFS `writeBytes`) | 写入 escrow JSON | subject 所有者、`default` bucket、固定 escrow 路径、`application/json` |
|
|
381
|
+
| `storage.set_acl` | 授予 owner 读取 escrow 对象 | `grantee_aid=owner_aid`、`perms=r`;只作用于该 escrow 对象 |
|
|
382
|
+
| `storage.create_download_ticket` | 生成 owner 下载票据 | `owner_aid=subject_aid`、`bucket=default`、对象 key 去掉开头 `/`、`viewer_aid=owner_aid` |
|
|
383
|
+
| Storage 数据面 GET | 下载封套 | 跨 issuer 使用资源域票据;同 issuer 可使用当前 access token getter |
|
|
384
|
+
|
|
385
|
+
SDK 不因 ownership 自动为其它业务目录建立 ACL、备份或清理策略。Storage 的通用 RPC 参数和错误语义见 [Storage RPC 手册](../sdk/09-storage-rpc-manual.md)。
|
|
386
|
+
|
|
387
|
+
### 7.3 Name Service HTTP
|
|
388
|
+
|
|
389
|
+
| 方法 | 用途 | ownership 相关校验 |
|
|
390
|
+
| --- | --- | --- |
|
|
391
|
+
| `PUT /agent.md` | subject 自签上传或 owner 代上传 | 校验 frontmatter、主体尾部签名、ownership proof、上传者和 owner 授权;成功返回 ETag |
|
|
392
|
+
| `GET /agent.md`、`HEAD /agent.md` | 下载或查询版本 | 返回正文、ETag、`Last-Modified`;SDK 下载后分别验证文件签名和 ownership |
|
|
393
|
+
|
|
394
|
+
服务端拒绝普通上传清除或替换已保存 owner;必须由原 owner 的有效 release 声明触发无 owner 文档上传。Name Service 不保存 SDK 的 `pending`/`active`/`released` 本地状态机。
|
|
395
|
+
|
|
396
|
+
### 7.4 Auth/CA 与 SDK 本地接口
|
|
397
|
+
|
|
398
|
+
Auth/CA 仅提供已有 token、证书解析、证书生命周期和 AID 校验能力,不提供 `ownership.bind`、`ownership.release` 等专用 RPC。SDK 本地使用已有 `AIDStore`/`AID`/`rekey`/identity 导入和 metadata 存储;这些是实现接口,不是跨模块 wire RPC。
|
|
399
|
+
|
|
400
|
+
## 8. SDK 事件与本地状态
|
|
401
|
+
|
|
402
|
+
有效 `bind.request` 被 SDK 拦截后发布:
|
|
403
|
+
|
|
404
|
+
```json
|
|
405
|
+
{
|
|
406
|
+
"event": "ownership.request",
|
|
407
|
+
"request_id": "...",
|
|
408
|
+
"proof_id": "...",
|
|
409
|
+
"subject_aid": "subject.agentid.pub",
|
|
410
|
+
"owner_aid": "owner.agentid.pub",
|
|
411
|
+
"subject_type": "agent",
|
|
412
|
+
"requester_aid": "owner.agentid.pub",
|
|
413
|
+
"requester_role": "owner",
|
|
414
|
+
"statement": {"version": 2, "...": "..."},
|
|
415
|
+
"signature": {"cert_fingerprint": "...", "signature": "..."}
|
|
416
|
+
}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
应用只能通过 `acceptOwnershipRequest(request_id, { extensions })` 或 `rejectOwnershipRequest(request_id)` 作出决定。SDK 本地关系记录至少关联 `subject_aid`、`owner_aid`、`proof_id`、`request_id`、双方原始声明/签名、`status` 和待发送消息;`subject_identity`、`escrow_password`、`escrow_download_url` 不得出现在公开状态摘要。
|
|
420
|
+
|
|
421
|
+
绑定与释放的关键本地状态为:
|
|
422
|
+
|
|
423
|
+
```text
|
|
424
|
+
pending → active → release_pending → released
|
|
425
|
+
pending → rejected
|
|
426
|
+
release_pending → pending_rekey → pending_agent_md → pending_upload → released
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
`active` 只表示本地保存了完整关系 proof,不表示 escrow 或 owner 代上传已经成功。待发送消息、待审批事件、待上传正文和 rekey 阶段必须可持久化并在重连/重启后恢复。
|
|
430
|
+
|
|
431
|
+
## 9. 校验与兼容要求
|
|
432
|
+
|
|
433
|
+
接收 SDK 按以下顺序处理:
|
|
434
|
+
|
|
435
|
+
1. 解密并解析消息,确认 `type`、action、sender、双方 AID、`request_id` 和 `proof_id`。
|
|
436
|
+
2. 对 `bind.request`/`bind.response` 验证对端证书、statement 角色和签名;对后续消息匹配同一关系记录。
|
|
437
|
+
3. 对 `escrow.ready` 校验 sender 是 subject、关系为 active,再下载、解密、校验明文摘要和 identity AID。
|
|
438
|
+
4. 对 `release.request` 校验 sender 是原 owner,并验证完整旧 proof 或本地 active 记录;失败消息不投递应用层。
|
|
439
|
+
5. 对 `agent.md` 下载分别返回文件签名状态和 ownership 状态;不得用文件签名成功替代关系 proof 验证。
|
|
440
|
+
|
|
441
|
+
self-owner 不发送 bind P2P、没有 escrow 和外部审批。subject 不能单方发起 release。owner 代上传不新增 Name Service 或 Auth RPC;任何实现若修改 action 名、公共字段、签名域、escrow 参数或 HTTP 头,必须先更新协议并同步四端。
|
|
442
|
+
|
|
443
|
+
参考实现:[TypeScript proof](../../ts/src/ownership-proof.ts)、[TypeScript client](../../ts/src/client.ts)、[Python protocol](../../python/src/aun_core/ownership_protocol.py)、[Go protocol](../../go/ownership_protocol.go)、[agent.md Schema](../agent.md/SCHEMA.md)、[Name Service agent.md handler](../../../extensions/services/nameservice/go/internal/httpserver/agentmd.go)。
|