@agentunion/fastaun-browser 0.5.19 → 0.5.21

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 (154) hide show
  1. package/CHANGELOG.md +176 -78
  2. package/_packed_docs/CHANGELOG.md +176 -78
  3. package/_packed_docs/INDEX.md +288 -269
  4. package/_packed_docs/KITE_DOCS_GUIDE.md +101 -95
  5. package/_packed_docs/agent.md/SCHEMA.md +7 -7
  6. package/_packed_docs/agent.md/working/AID/347/261/273/345/236/213-owner/345/205/263/347/263/273/344/270/216/346/215/242owner/347/274/226/346/216/222/346/226/271/346/241/210.md +530 -0
  7. package/_packed_docs/agent.md/working/AID/347/261/273/345/236/213-owner/345/205/263/347/263/273/345/256/214/346/225/264/350/256/276/350/256/241/344/270/216/345/256/236/346/226/275/350/256/241/345/210/222.md +685 -0
  8. package/_packed_docs/agent.md/working/agent.md-schema/344/270/216/347/255/276/345/217/221/351/252/214/347/255/276/346/265/201/347/250/213/346/276/204/346/270/205.md +349 -0
  9. package/_packed_docs/agent.md/working//346/234/254/345/234/260Docker/346/265/213/350/257/225Bug/346/270/205/345/215/225.md +40 -0
  10. 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
  11. package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +372 -331
  12. package/_packed_docs/protocol/08-AUN-E2EE.md +17 -12
  13. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +676 -676
  14. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +8 -12
  15. package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/211.md +445 -0
  16. package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.0.md +161 -0
  17. package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.1.md +666 -0
  18. package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2113.0.md +233 -0
  19. package/_packed_docs/protocol/agent.md/SCHEMA.md +1 -1
  20. package/_packed_docs/sdk/0.5.21-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +368 -0
  21. package/_packed_docs/sdk/0.5.21-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +350 -0
  22. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +1 -1
  23. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +5 -1
  24. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +64 -64
  25. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +70 -63
  26. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +43 -40
  27. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +179 -19
  28. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +50 -49
  29. package/_packed_docs/sdk/09-group-rpc-manual.md +261 -254
  30. package/_packed_docs/sdk/09-message-rpc-manual.md +253 -160
  31. package/_packed_docs/sdk/09-storage-rpc-manual.md +18 -26
  32. package/_packed_docs/sdk/09-/345/207/255/350/257/201/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +71 -0
  33. package/_packed_docs/sdk/09-/347/273/204/347/273/207/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +88 -0
  34. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +105 -92
  35. package/_packed_docs/sdk/INDEX.md +197 -167
  36. package/_packed_docs/sdk/Ownership-SDK/345/256/236/347/216/260/346/214/207/345/215/227.md +169 -0
  37. package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/227.md +349 -0
  38. package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/2272.1.md +930 -0
  39. package/_packed_docs/sdk/Ownership-SDK/351/233/206/346/210/220/346/214/207/345/215/227.md +270 -0
  40. 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 +363 -0
  41. 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 +553 -0
  42. 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
  43. package/_packed_docs/sdk/Ownership2.1/350/257/246/347/273/206/350/256/276/350/256/241.md +480 -0
  44. package/_packed_docs/sdk/Ownership/347/256/241/347/220/206/344/270/223/351/242/230.md +559 -0
  45. package/_packed_docs/sdk/ProtectedHeaders/347/224/250/346/263/225/344/270/223/351/242/230.md +299 -0
  46. 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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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
  54. package/dist/agent-md-schema.d.ts +16 -4
  55. package/dist/agent-md-schema.d.ts.map +1 -1
  56. package/dist/agent-md-schema.js +65 -30
  57. package/dist/agent-md-schema.js.map +1 -1
  58. package/dist/agent-md.d.ts +35 -3
  59. package/dist/agent-md.d.ts.map +1 -1
  60. package/dist/agent-md.js +384 -150
  61. package/dist/agent-md.js.map +1 -1
  62. package/dist/aid-store.d.ts +59 -0
  63. package/dist/aid-store.d.ts.map +1 -1
  64. package/dist/aid-store.js +202 -16
  65. package/dist/aid-store.js.map +1 -1
  66. package/dist/aid.d.ts +4 -1
  67. package/dist/aid.d.ts.map +1 -1
  68. package/dist/aid.js +24 -42
  69. package/dist/aid.js.map +1 -1
  70. package/dist/auth.d.ts +1 -1
  71. package/dist/auth.d.ts.map +1 -1
  72. package/dist/auth.js +89 -18
  73. package/dist/auth.js.map +1 -1
  74. package/dist/bundle.js +6410 -1848
  75. package/dist/cert-utils.d.ts +50 -1
  76. package/dist/cert-utils.d.ts.map +1 -1
  77. package/dist/cert-utils.js +123 -56
  78. package/dist/cert-utils.js.map +1 -1
  79. package/dist/client/delivery.d.ts +108 -16
  80. package/dist/client/delivery.d.ts.map +1 -1
  81. package/dist/client/delivery.js +1411 -184
  82. package/dist/client/delivery.js.map +1 -1
  83. package/dist/client/rpc-pipeline.d.ts +4 -1
  84. package/dist/client/rpc-pipeline.d.ts.map +1 -1
  85. package/dist/client/rpc-pipeline.js +203 -117
  86. package/dist/client/rpc-pipeline.js.map +1 -1
  87. package/dist/client/v2-e2ee.d.ts +22 -3
  88. package/dist/client/v2-e2ee.d.ts.map +1 -1
  89. package/dist/client/v2-e2ee.js +1312 -684
  90. package/dist/client/v2-e2ee.js.map +1 -1
  91. package/dist/client.d.ts +23 -2
  92. package/dist/client.d.ts.map +1 -1
  93. package/dist/client.js +419 -101
  94. package/dist/client.js.map +1 -1
  95. package/dist/config.d.ts +4 -0
  96. package/dist/config.d.ts.map +1 -1
  97. package/dist/config.js +1 -0
  98. package/dist/config.js.map +1 -1
  99. package/dist/crypto.d.ts.map +1 -1
  100. package/dist/crypto.js +8 -6
  101. package/dist/crypto.js.map +1 -1
  102. package/dist/events.d.ts +24 -3
  103. package/dist/events.d.ts.map +1 -1
  104. package/dist/events.js +171 -29
  105. package/dist/events.js.map +1 -1
  106. package/dist/facades.d.ts +42 -1
  107. package/dist/facades.d.ts.map +1 -1
  108. package/dist/facades.js +368 -12
  109. package/dist/facades.js.map +1 -1
  110. package/dist/index.d.ts +6 -4
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +1 -1
  113. package/dist/index.js.map +1 -1
  114. package/dist/keystore/index.d.ts +14 -1
  115. package/dist/keystore/index.d.ts.map +1 -1
  116. package/dist/keystore/indexeddb-identity-store.d.ts +4 -0
  117. package/dist/keystore/indexeddb-identity-store.d.ts.map +1 -1
  118. package/dist/keystore/indexeddb-identity-store.js +30 -13
  119. package/dist/keystore/indexeddb-identity-store.js.map +1 -1
  120. package/dist/keystore/indexeddb-shared.d.ts +19 -2
  121. package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
  122. package/dist/keystore/indexeddb-shared.js +193 -6
  123. package/dist/keystore/indexeddb-shared.js.map +1 -1
  124. package/dist/keystore/indexeddb-token-store.d.ts +15 -2
  125. package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
  126. package/dist/keystore/indexeddb-token-store.js +308 -27
  127. package/dist/keystore/indexeddb-token-store.js.map +1 -1
  128. package/dist/org-protocol.d.ts +45 -0
  129. package/dist/org-protocol.d.ts.map +1 -1
  130. package/dist/org-protocol.js +827 -21
  131. package/dist/org-protocol.js.map +1 -1
  132. package/dist/ownership-v21.d.ts +43 -9
  133. package/dist/ownership-v21.d.ts.map +1 -1
  134. package/dist/ownership-v21.js +183 -81
  135. package/dist/ownership-v21.js.map +1 -1
  136. package/dist/ownership-workflow.d.ts +36 -1
  137. package/dist/ownership-workflow.d.ts.map +1 -1
  138. package/dist/ownership-workflow.js +610 -89
  139. package/dist/ownership-workflow.js.map +1 -1
  140. package/dist/seq-tracker.d.ts +2 -0
  141. package/dist/seq-tracker.d.ts.map +1 -1
  142. package/dist/seq-tracker.js +3 -2
  143. package/dist/seq-tracker.js.map +1 -1
  144. package/dist/tools/cross-sdk-agent.d.ts +61 -3
  145. package/dist/tools/cross-sdk-agent.d.ts.map +1 -1
  146. package/dist/tools/cross-sdk-agent.js +524 -45
  147. package/dist/tools/cross-sdk-agent.js.map +1 -1
  148. package/dist/transport.d.ts +4 -0
  149. package/dist/transport.d.ts.map +1 -1
  150. package/dist/transport.js +64 -30
  151. package/dist/transport.js.map +1 -1
  152. package/dist/version.d.ts +1 -1
  153. package/dist/version.js +1 -1
  154. package/package.json +1 -1
@@ -0,0 +1,559 @@
1
+ # Ownership 管理专题
2
+
3
+ 本文保留 legacy `aun.ownership.v1` 的历史方案与实现记录,不代表当前 Ownership 2.1 契约。文中“当前”“实现差异”均指该历史基线;proof、自动托管、代签、代上传及自动 rekey 不能作为 2.1 接入方式。
4
+
5
+ 当前文件、锁和版本规则见 [Ownership 协议定义 2.1](../protocol/Ownership协议定义2.1.md),SDK 接入见 [2.1 应用集成指南](Ownership2.1-SDK应用集成指南.md),编排见 [SDK 编排指南 2.1](Ownership-SDK编排指南2.1.md)。[Ownership 2.0](../protocol/Ownership协议定义2.0.md) 及其 [SCHEMA](../agent.md/SCHEMA.md) 同为历史版本,各版本字段和流程不能混用。
6
+
7
+ ## 1. 关系模型
8
+
9
+ - `subject_aid`:被 owner 管理、其 `agent.md` 可由 owner 代签名上传的 AID。
10
+ - `owner_aid`:对 subject 承担所有权责任的 AID。
11
+ - `type`:subject 的应用层类型,默认 `agent`。
12
+ - `extensions`:应用层按需附加字段,由发起方传入,SDK 不解释其业务含义。
13
+
14
+ 双方签名只表示关系成立。两方签名的声明自包含双方 AID、`proof_id`、签名角色和各自扩展字段,因此 subject 与 owner 不要求签署完全相同的扩展字段。SDK 的状态查询返回关系摘要,不暴露私钥或 escrow 密码。
15
+
16
+ 关系建立完成前,SDK 只提供功能降级,不要求跨端事务;关系签名、托管和代上传分别持久化。消息或进程中断后,SDK 可依据本地 metadata 中的 pending 状态恢复托管、代上传和解绑后的 rekey/agent.md 上传。
17
+
18
+ subject 取得双方签名后立即持久化完整 proof,并自行签名发布包含该 proof 的 `agent.md`,不等待托管。发布失败时保留待上传的签名版本,后续仍单独尝试托管;托管失败也不撤销 active 关系或已经公开的 proof。只有 owner 拿到并持久化 subject identity 后,才能推进代签和代上传。
19
+
20
+ ## 2. 对外 SDK 方法
21
+
22
+ | 方向 | Python | TypeScript / JavaScript | Go |
23
+ | --- | --- | --- | --- |
24
+ | owner 发起绑定 subject | `bind_aid(subject_aid)`;`bindAid` 为别名 | `bindAid(subjectAid)` | `BindAID(ctx, subjectAID)`;`BindAid` 为别名 |
25
+ | subject 发起绑定 owner | `bind_owner(owner_aid)`;`bindOwner` 为别名 | `bindOwner(ownerAid)` | `BindOwner(ctx, ownerAID)` |
26
+ | 接受收到的绑定请求 | `accept_ownership_request(request_id)`;`acceptOwnershipRequest` 为别名 | `acceptOwnershipRequest(requestId)` | `AcceptOwnershipRequest(ctx, requestID)` |
27
+ | 拒绝收到的绑定请求 | `reject_ownership_request(request_id)`;`rejectOwnershipRequest` 为别名 | `rejectOwnershipRequest(requestId)` | `RejectOwnershipRequest(ctx, requestID)` |
28
+ | 查询 subject 类型 | `get_type()` / `getType()` | `getType()` | `GetType()` |
29
+ | 查询 owner | `get_owner()` / `getOwner()` | `getOwner()` | `GetOwner()` |
30
+ | 查询公开状态 | `get_ownership_status()` / `getOwnershipStatus()` | `getOwnershipStatus()` | `GetOwnershipStatus()` |
31
+
32
+ 绑定方法可传 `subject_type`/`subjectType`、`extensions` 和可选 `request_id`。话题、群或其它业务 key 属于应用层字段,若需要随关系声明保存,应放入 `extensions`;SDK 不生成或解释这些 key。
33
+
34
+ ## 3. P2P 消息协议
35
+
36
+ ownership 消息的 payload `type` 固定为 `aun.ownership.v1`,公共字段如下:
37
+
38
+ ```json
39
+ {
40
+ "type": "aun.ownership.v1",
41
+ "action": "bind.request",
42
+ "request_id": "...",
43
+ "proof_id": "...",
44
+ "subject_aid": "subject.agentid.pub",
45
+ "owner_aid": "owner.agentid.pub"
46
+ }
47
+ ```
48
+
49
+ 消息通过 `message.send` 发送并要求加密。SDK 在消息投递到应用层之前拦截该 payload;应用层不应直接处理 `aun.ownership.v1`。
50
+
51
+ | action | 发送方向 | 主要字段与作用 |
52
+ | --- | --- | --- |
53
+ | `bind.request` | 发起方 → 对端 | 发起方的独立 `statement` / `signature`;接收 SDK 验证后发布 `ownership.request` 给应用层 |
54
+ | `bind.response` | 接受方 → 发起方 | 应用接受请求后,由接受方签署自己的独立声明并回复;双方签名齐全时关系成立 |
55
+ | `bind.reject` | 拒绝方 → 发起方 | 应用拒绝请求后发送;记录为 rejected,不执行托管和代上传 |
56
+ | `escrow.ready` | subject → owner | 关系成立后发送加密 identity 的地址、密码和摘要;不表示 `agent.md` 已上传 |
57
+ | `agent_md.updated` | owner → subject | owner 代上传成功后通知 subject 下载并同步 `agent.md` |
58
+ | `release.request` | owner → subject | 原 owner 签署放弃声明;subject 验证当前关系后自动 rekey 并上传不带 owner 的 `agent.md` |
59
+
60
+ `bind.confirm` 不属于当前分阶段流程。关系绑定、证书托管和 owner 代上传是三个独立结果;托管或代上传失败不撤销已完成的双方签名关系。
61
+
62
+ 以下是各 action 的完整 payload 示例;每个对象单独作为 `message.send` 的 `payload`,签名和密码仅通过加密 P2P 传送。`bind.reject` 是拒绝分支,与 `bind.response` 二选一。
63
+
64
+ ```json
65
+ {
66
+ "type": "aun.ownership.v1",
67
+ "action": "bind.request",
68
+ "request_id": "request-20261008-001",
69
+ "proof_id": "550e8400-e29b-41d4-a716-446655440000",
70
+ "subject_aid": "subject.agentid.pub",
71
+ "owner_aid": "owner.agentid.pub",
72
+ "subject_type": "agent",
73
+ "statement": {
74
+ "version": 2,
75
+ "proof_id": "550e8400-e29b-41d4-a716-446655440000",
76
+ "subject_aid": "subject.agentid.pub",
77
+ "owner_aid": "owner.agentid.pub",
78
+ "signer_aid": "owner.agentid.pub",
79
+ "role": "owner",
80
+ "signed_at": 1791446400,
81
+ "extensions": {"department": "clinic"}
82
+ },
83
+ "signature": {
84
+ "cert_fingerprint": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
85
+ "signature": "BASE64_OWNER_SIGNATURE",
86
+ "signer_aid": "owner.agentid.pub",
87
+ "role": "owner",
88
+ "statement": {
89
+ "version": 2,
90
+ "proof_id": "550e8400-e29b-41d4-a716-446655440000",
91
+ "subject_aid": "subject.agentid.pub",
92
+ "owner_aid": "owner.agentid.pub",
93
+ "signer_aid": "owner.agentid.pub",
94
+ "role": "owner",
95
+ "signed_at": 1791446400,
96
+ "extensions": {"department": "clinic"}
97
+ }
98
+ }
99
+ }
100
+ ```
101
+
102
+ ```json
103
+ {
104
+ "type": "aun.ownership.v1",
105
+ "action": "bind.response",
106
+ "request_id": "request-20261008-001",
107
+ "proof_id": "550e8400-e29b-41d4-a716-446655440000",
108
+ "subject_aid": "subject.agentid.pub",
109
+ "owner_aid": "owner.agentid.pub",
110
+ "subject_type": "agent",
111
+ "statement": {
112
+ "version": 2,
113
+ "proof_id": "550e8400-e29b-41d4-a716-446655440000",
114
+ "subject_aid": "subject.agentid.pub",
115
+ "owner_aid": "owner.agentid.pub",
116
+ "signer_aid": "subject.agentid.pub",
117
+ "role": "subject",
118
+ "signed_at": 1791446460,
119
+ "extensions": {"managed_by": "clinic-app"}
120
+ },
121
+ "signature": {
122
+ "cert_fingerprint": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
123
+ "signature": "BASE64_SUBJECT_SIGNATURE",
124
+ "signer_aid": "subject.agentid.pub",
125
+ "role": "subject",
126
+ "statement": {
127
+ "version": 2,
128
+ "proof_id": "550e8400-e29b-41d4-a716-446655440000",
129
+ "subject_aid": "subject.agentid.pub",
130
+ "owner_aid": "owner.agentid.pub",
131
+ "signer_aid": "subject.agentid.pub",
132
+ "role": "subject",
133
+ "signed_at": 1791446460,
134
+ "extensions": {"managed_by": "clinic-app"}
135
+ }
136
+ }
137
+ }
138
+ ```
139
+
140
+ ```json
141
+ {
142
+ "type": "aun.ownership.v1",
143
+ "action": "bind.reject",
144
+ "request_id": "request-20261008-001",
145
+ "proof_id": "550e8400-e29b-41d4-a716-446655440000",
146
+ "subject_aid": "subject.agentid.pub",
147
+ "owner_aid": "owner.agentid.pub"
148
+ }
149
+ ```
150
+
151
+ ```json
152
+ {
153
+ "type": "aun.ownership.v1",
154
+ "action": "escrow.ready",
155
+ "request_id": "request-20261008-001",
156
+ "proof_id": "550e8400-e29b-41d4-a716-446655440000",
157
+ "subject_aid": "subject.agentid.pub",
158
+ "owner_aid": "owner.agentid.pub",
159
+ "subject_type": "agent",
160
+ "escrow_path": "/.aun/ownership/subject.agentid.pub/550e8400-e29b-41d4-a716-446655440000.json",
161
+ "escrow_download_url": "https://storage.agentid.pub/download/opaque-token",
162
+ "escrow_password": "BASE64URL_RANDOM_PASSWORD",
163
+ "escrow_sha256": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
164
+ }
165
+ ```
166
+
167
+ ```json
168
+ {
169
+ "type": "aun.ownership.v1",
170
+ "action": "agent_md.updated",
171
+ "request_id": "request-20261008-001",
172
+ "proof_id": "550e8400-e29b-41d4-a716-446655440000",
173
+ "subject_aid": "subject.agentid.pub",
174
+ "owner_aid": "owner.agentid.pub"
175
+ }
176
+ ```
177
+
178
+ ```json
179
+ {
180
+ "type": "aun.ownership.v1",
181
+ "action": "release.request",
182
+ "request_id": "release-20261008-001",
183
+ "proof_id": "550e8400-e29b-41d4-a716-446655440000",
184
+ "subject_aid": "subject.agentid.pub",
185
+ "owner_aid": "owner.agentid.pub",
186
+ "ownership_release": {
187
+ "cert_fingerprint": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
188
+ "signature": "BASE64_OWNER_RELEASE_SIGNATURE",
189
+ "signer_aid": "owner.agentid.pub",
190
+ "role": "owner",
191
+ "statement": {
192
+ "version": 1,
193
+ "action": "release",
194
+ "proof_id": "550e8400-e29b-41d4-a716-446655440000",
195
+ "subject_aid": "subject.agentid.pub",
196
+ "owner_aid": "owner.agentid.pub",
197
+ "signer_aid": "owner.agentid.pub",
198
+ "role": "owner",
199
+ "signed_at": 1791446460
200
+ }
201
+ }
202
+ }
203
+ ```
204
+
205
+ ### 3.1 应用层确认
206
+
207
+ SDK 在收到 `aun.ownership.v1` 后先拦截原始 P2P 消息,检查消息发送者、双方 AID、proof id 和签名。有效的 `bind.request` 不会作为普通 `message.received` 投递,而会发布以下应用事件:
208
+
209
+ ```json
210
+ {
211
+ "event": "ownership.request",
212
+ "payload": {
213
+ "request_id": "request-20261008-001",
214
+ "proof_id": "550e8400-e29b-41d4-a716-446655440000",
215
+ "subject_aid": "subject.agentid.pub",
216
+ "owner_aid": "owner.agentid.pub",
217
+ "subject_type": "agent",
218
+ "requester_aid": "owner.agentid.pub",
219
+ "requester_role": "owner",
220
+ "statement": {
221
+ "version": 2,
222
+ "proof_id": "550e8400-e29b-41d4-a716-446655440000",
223
+ "subject_aid": "subject.agentid.pub",
224
+ "owner_aid": "owner.agentid.pub",
225
+ "signer_aid": "owner.agentid.pub",
226
+ "role": "owner",
227
+ "signed_at": 1791446400,
228
+ "extensions": {"department": "clinic"}
229
+ },
230
+ "signature": {
231
+ "cert_fingerprint": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
232
+ "signature": "BASE64_SIGNATURE",
233
+ "signer_aid": "owner.agentid.pub",
234
+ "role": "owner",
235
+ "statement": {
236
+ "version": 2,
237
+ "proof_id": "550e8400-e29b-41d4-a716-446655440000",
238
+ "subject_aid": "subject.agentid.pub",
239
+ "owner_aid": "owner.agentid.pub",
240
+ "signer_aid": "owner.agentid.pub",
241
+ "role": "owner",
242
+ "signed_at": 1791446400,
243
+ "extensions": {"department": "clinic"}
244
+ }
245
+ }
246
+ }
247
+ }
248
+ ```
249
+
250
+ 应用收到事件后自行决定接受或拒绝,并调用 SDK 的对应方法。接受会签署本端角色的独立 ownership 声明并发送 `bind.response`;拒绝发送 `bind.reject`。SDK 在接受完成后自动推进托管和代上传,应用不需要再次确认这些后续步骤。
251
+
252
+ ### 3.2 owner 发起:`BindAID`
253
+
254
+ 1. owner 创建 role 为 `owner` 的声明并签名,发送 `bind.request`;subject SDK 验证后将该单方 proof 写入本地 metadata。
255
+ 2. subject SDK 向 subject 应用发布 `ownership.request`,等待应用决策;此时 subject 尚未签署,也没有完整 ownership proof。
256
+ 3. subject 应用调用 `acceptOwnershipRequest(request_id)`;SDK 创建 subject 声明、保存双方 proof,并发送 `bind.response`。应用拒绝时调用 `rejectOwnershipRequest(request_id)`,本流程结束。
257
+ 4. 关系签名完成后,subject SDK 先用自己的 AID 上传包含完整 proof 的 `agent.md`,再自动将加密 identity 上传到 subject 的 Storage 并授予 owner 读取 ACL;随后单独发送 `escrow.ready`。名片上传或托管失败不撤销关系,也不阻止另一项操作。
258
+ 5. owner SDK 收到 `escrow.ready` 后自动下载并解密 subject identity,以 subject 证书签署 `agent.md`,再使用 owner 签名的上传授权头上传到 subject 的 Name Service。
259
+ 6. owner 上传成功后发送 `agent_md.updated`;subject SDK 下载、验证并同步本地 `agent.md`。
260
+
261
+ 若第 4 或第 5 步失败,双方签名已成立的关系继续保持;只表示托管或名片更新尚未完成。
262
+
263
+ ```mermaid
264
+ sequenceDiagram
265
+ participant O as owner SDK
266
+ participant M as AUN 加密 P2P
267
+ participant S as subject SDK
268
+ participant A as subject 应用
269
+ participant N as subject Name Service
270
+ O->>O: 独立签署 owner 声明
271
+ O->>M: bind.request(owner 声明和签名)
272
+ M->>S: SDK 拦截、验证 bind.request
273
+ S->>S: 将 owner 单方 proof 写入 subject 本地 metadata
274
+ S->>A: ownership.request(验证后的绑定申请)
275
+ A->>S: acceptOwnershipRequest 或 rejectOwnershipRequest
276
+ alt 应用接受
277
+ S->>S: 独立签署 subject 声明并保存 proof
278
+ S->>M: bind.response(subject 声明和签名)
279
+ M->>O: 验证 subject 声明并保存完整 proof
280
+ Note over S,O: 关系签署已完成,后续托管不影响该结果
281
+ S->>N: subject 立即尝试发布完整 proof 的 agent.md
282
+ Note over S,N: 发布失败保留 pending 上传,仍继续尝试托管
283
+ S->>S: 上传加密 identity 并授予 owner 读取权限
284
+ S->>M: escrow.ready(下载地址、密码、摘要)
285
+ M->>O: SDK 拦截、验证 escrow.ready
286
+ O->>S: 下载加密 identity
287
+ O->>O: 解密 identity,以 subject 证书签署 agent.md
288
+ O->>N: 携带 owner 签名授权头上传 agent.md
289
+ O->>M: agent_md.updated
290
+ M->>S: SDK 拦截并下载同步 agent.md
291
+ else 应用拒绝
292
+ S->>M: bind.reject
293
+ M->>O: SDK 记录拒绝结果
294
+ end
295
+ ```
296
+
297
+ ### 3.3 subject 发起:`BindOwner`
298
+
299
+ 1. subject 创建 role 为 `subject` 的声明并签名,将单方 proof 写入本地 metadata 和本地 `agent.md`,再上传这个带 owner 声明的不完整 `agent.md`,最后发送 `bind.request`。在 owner 确认前,外部可观察到这份单方声明,但关系状态仍不完整。
300
+ 2. owner SDK 验证请求并向 owner 应用发布 `ownership.request`,等待应用决策。
301
+ 3. owner 应用接受后调用 `acceptOwnershipRequest(request_id)`;SDK 创建 owner 声明并发送 `bind.response`。应用拒绝则发送 `bind.reject`。
302
+ 4. subject 收到双方 proof 完整的 `bind.response` 后保存并自行签名上传完整 proof 的 `agent.md`,随后自动上传加密 identity 并发送 `escrow.ready`。
303
+ 5. owner SDK 自动下载托管 identity,使用 subject 证书签署 `agent.md`,再使用 owner 签名的上传授权头上传。
304
+ 6. owner 上传成功后发送 `agent_md.updated`,subject SDK 自动下载、验证并同步。
305
+
306
+ 托管或代上传失败不会使第 3 步已经成立的关系失效,也不会触发应用层的第二次确认。
307
+
308
+ ```mermaid
309
+ sequenceDiagram
310
+ participant S as subject SDK
311
+ participant M as AUN 加密 P2P
312
+ participant O as owner SDK
313
+ participant A as owner 应用
314
+ participant N as subject Name Service
315
+ S->>S: 独立签署 subject 声明并保存到 metadata 和本地 agent.md
316
+ S->>N: 上传 subject 自己签名的不完整 proof agent.md
317
+ S->>M: bind.request(subject 声明和签名)
318
+ M->>O: SDK 拦截、验证 bind.request
319
+ O->>A: ownership.request(验证后的绑定申请)
320
+ A->>O: acceptOwnershipRequest 或 rejectOwnershipRequest
321
+ alt 应用接受
322
+ O->>O: 独立签署 owner 声明并保存 proof
323
+ O->>M: bind.response(owner 声明和签名)
324
+ M->>S: SDK 拦截并验证 bind.response
325
+ Note over S,O: 关系签署已完成,后续托管不影响该结果
326
+ S->>N: subject 立即尝试发布完整 proof 的 agent.md
327
+ Note over S,N: 发布失败保留 pending 上传,仍继续尝试托管
328
+ S->>S: 上传加密 identity 并授予 owner 读取权限
329
+ S->>M: escrow.ready(下载地址、密码、摘要)
330
+ M->>O: SDK 拦截、验证 escrow.ready
331
+ O->>S: 下载加密 identity
332
+ O->>O: 解密 identity,以 subject 证书签署 agent.md
333
+ O->>N: 携带 owner 签名授权头上传 agent.md
334
+ O->>M: agent_md.updated
335
+ M->>S: SDK 拦截并下载同步 agent.md
336
+ else 应用拒绝
337
+ O->>M: bind.reject
338
+ M->>S: SDK 记录拒绝结果
339
+ end
340
+ ```
341
+
342
+ ### 3.4 self-owner
343
+
344
+ self-owner 表示 `subject_aid == owner_aid`:只保留 subject 签名,不上传 escrow,不包含 `owner_signature`,并由本地 subject 签名和上传 `agent.md`。四个 SDK 的 `bindAid` / `bindOwner` 都在本地处理该分支,不发送绑定 P2P 消息。
345
+
346
+ ### 3.5 解绑:`release.request`
347
+
348
+ 解绑没有独立的服务端 RPC,也不支持 subject 发起。原 owner 调用 `releaseOwnership(subjectAid)`,使用当前关系的 `proof_id` 生成 `ownership_release`,并用 owner 证书签署带 `signed_at` 的 release statement,通过加密 P2P 发送给 subject。SDK 只接受来自原 owner 的请求,并要求本地 active 记录或本地 `agent.md` 中存在同一 `proof_id` 的完整双方 proof;缺少关系证据时消息被拦截,不执行 rekey。
349
+
350
+ subject 收到并验证后自动执行以下步骤,应用层不需要再次确认:
351
+
352
+ 1. 持久化 `pending_rekey`、release 声明和本地 `agent.md` 快照。
353
+ 2. 参考创建 AID 的恢复机制执行 rekey;成功后进入 `pending_agent_md`。
354
+ 3. 比较本地与 Name Service 的 `agent.md` 尾部签名时间戳,选择较新版本作为基底;时间相同优先服务端版本。
355
+ 4. 删除 `owner`、`ownership_proof`,保留 `ownership_release`,用新 subject 证书签名并持久化待上传内容,进入 `pending_upload`。
356
+ 5. 上传成功后记录 `released`;若远端已经存在相同 release 的 `agent.md`,可直接收敛为 `released`。
357
+
358
+ `ownership_release` 是旧 owner 的历史声明,服务端按声明的 `signed_at` 验证旧证书在签署时有效,不要求该证书当前仍为 `active_signing`。Name Service 同时把 release 的 subject、owner、proof_id 与服务端保存的当前 ownership 关系匹配;不匹配时拒绝上传。解绑完成后,新的 `agent.md` 不再包含 owner/proof,只有 `ownership_release` 用于说明原关系已释放。
359
+
360
+ ```mermaid
361
+ sequenceDiagram
362
+ participant O as 原 owner SDK
363
+ participant M as AUN 加密 P2P
364
+ participant S as subject SDK
365
+ participant N as Name Service
366
+ O->>O: 读取 active 关系并签署 ownership_release
367
+ O->>M: release.request(owner 签名声明)
368
+ M->>S: SDK 拦截并验证 sender、proof_id、旧 owner 证书
369
+ S->>S: 校验本地 active metadata 或完整 agent.md proof
370
+ S->>S: 持久化 pending_rekey
371
+ S->>S: rekey,成功后进入 pending_agent_md
372
+ S->>N: 下载当前 agent.md
373
+ S->>S: 按尾部签名时间戳选择较新基底,移除 owner/proof,保留 ownership_release
374
+ S->>S: 持久化 pending_upload
375
+ S->>N: 上传新 subject 签名的 agent.md
376
+ N->>N: 验证 release 与已保存关系匹配,按 signed_at 验证旧 owner 证书
377
+ N-->>S: 上传成功
378
+ S->>S: 标记 released
379
+ ```
380
+
381
+ ## 4. ownership 声明与签名
382
+
383
+ P2P 消息内的声明为 v2:
384
+
385
+ ```json
386
+ {
387
+ "version": 2,
388
+ "proof_id": "uuid-v4-lowercase",
389
+ "subject_aid": "subject.agentid.pub",
390
+ "owner_aid": "owner.agentid.pub",
391
+ "signer_aid": "owner.agentid.pub",
392
+ "role": "owner"
393
+ }
394
+ ```
395
+
396
+ `extensions` 是可选字段;有值时进入各自签名的声明,双方不要求扩展字段相同。v2 声明包含 Unix 秒级 `signed_at`,签名输入覆盖该时间;各 SDK 下载端验签会检查证书在此时间有效。
397
+
398
+ 签名输入为:
399
+
400
+ ```text
401
+ UTF-8("AUN-AID-OWNER-RELATION-V1;") || canonical_json(statement)
402
+ ```
403
+
404
+ `canonical_json` 使用 UTF-8、字典序键、无空格;AID 使用小写规范形式。签名封套至少包含 `cert_fingerprint` 和严格 Base64 的 `signature`,可带 `signer_aid`、`role` 和签署时使用的 `statement`。`proof_id` 必须为小写 UUID v4。
405
+
406
+ 上传的关系版 `agent.md` 在 frontmatter 中同时包含 `owner` 和 `ownership_proof`:
407
+
408
+ ```yaml
409
+ owner: owner.agentid.pub
410
+ ownership_proof:
411
+ proof_id: ...
412
+ subject_aid: subject.agentid.pub
413
+ owner_aid: owner.agentid.pub
414
+ subject_signature:
415
+ cert_fingerprint: ...
416
+ signature: ...
417
+ statement: {version: 2, signer_aid: subject.agentid.pub, role: subject, ...}
418
+ owner_signature:
419
+ cert_fingerprint: ...
420
+ signature: ...
421
+ statement: {version: 2, signer_aid: owner.agentid.pub, role: owner, ...}
422
+ ```
423
+
424
+ subject 与外部 owner 时必须有两份签名;self-owner 必须省略 `owner_signature`。`human` 类型不能携带 owner 或 ownership proof。
425
+
426
+ ## 5. identity escrow
427
+
428
+ subject 上传的是包含 `aid`、`private_key_pem`、公钥和证书的完整 identity 包,不是明文证书。四端使用相同 envelope:
429
+
430
+ - AES-256-GCM;
431
+ - PBKDF2-SHA256,200000 次迭代;
432
+ - 16 字节 salt、12 字节 nonce;
433
+ - `sha256` 校验解密后的明文;
434
+ - AAD 为 `AUN-CERT-ESCROW-V1`。
435
+
436
+ 对象路径约定为:
437
+
438
+ ```text
439
+ /.aun/ownership/<lowercase_subject_aid>/<proof_id>.json
440
+ ```
441
+
442
+ 对象写入 subject 自己的 Storage。subject 只向 owner 授予 `r` 权限;密码和下载地址通过加密 P2P 消息发送。当前 escrow 包含 subject 私钥,因此 owner 获得的是可用于 subject 签名的完整 identity,而不只是证书。owner 下载解密后,SDK 将完整 identity 导入既有身份存储并加密保存私钥,再用于签署 subject 的 `agent.md`;内存中的 `subject_identity` 仅作 signer 缓存。公开 ownership 状态不会返回 identity 或 escrow 密码。
443
+
444
+ 下载票据有多个 URL 时,四端沿用 Storage 下载约定,按 `logical_url`、`download_url`、`url` 的顺序选择。`logical_url` 是 Storage 对外数据面地址,可避免公开 AID URL 重定向后丢失认证头。测试网络须能解析票据中的 subject AID 和 Storage 服务域名。
445
+
446
+ ### owner 本地托管材料的实际保存位置
447
+
448
+ owner 下载并解密 escrow 后,四端都调用已有身份存储的导入能力持久化完整 subject identity;`subject_identity` 只作为运行时 signer 缓存,不作为公开 ownership metadata 保存:
449
+
450
+ | SDK | 持久化位置 | 私钥保护 |
451
+ | --- | --- | --- |
452
+ | TypeScript / Go / Python | `{aunPath}/AIDs/{subjectAid}/private/key.json`(加密私钥)和 `{aunPath}/AIDs/{subjectAid}/public/cert.pem`(证书) | 沿用对应 `AIDStore`/`LocalIdentityStore` 的 `encryptionSeed`/`seed_password`;Go 同时保留历史证书缓存供按指纹验签 |
453
+ | JavaScript 浏览器 | IndexedDB 数据库 `aun-keystore` 的 `key_pairs`、`certs` 对象仓库,键为 subject AID | 沿用 `IndexedDBIdentityStore` 的 `encryptionSeed` 对私钥 PEM 加密 |
454
+
455
+ 文件型 SDK 的 `{aunPath}` 是 client/AIDStore 配置的 AUN 数据根;目录不存在时由身份存储创建。导入会先校验证书所属 AID、公钥与私钥匹配,再写入上述位置并重新加载自检。进程重启后 owner 通过同一 AIDStore/IndexedDB 读取 subject identity,不依赖内存中的 `subject_identity` 字段。
456
+
457
+ ```mermaid
458
+ sequenceDiagram
459
+ participant S as subject SDK
460
+ participant T as subject Storage
461
+ participant M as AUN 加密 P2P
462
+ participant O as owner SDK
463
+ S->>S: 打包 identity,生成密码并加密
464
+ S->>T: 上传加密 envelope 到 escrow_path
465
+ S->>T: 对该对象授予 owner 读取权限
466
+ T-->>S: 下载地址
467
+ S->>M: escrow.ready(地址、密码、摘要)
468
+ M->>O: SDK 拦截并校验关系声明和签名
469
+ O->>T: 以 owner 身份下载加密对象
470
+ T->>T: 校验 subject 授予的读取 ACL
471
+ T-->>O: 加密 envelope
472
+ O->>O: 解密并校验 subject 身份,导入身份存储并加密持久化私钥
473
+ ```
474
+
475
+ proof 完整、owner 已拿到托管 identity、代上传成功是三个独立结果。关系签名本身不证明托管或上传已完成。各 SDK 将关系 proof 和编排进度写入本地 metadata;进程重启后恢复待发送消息、待应用确认的申请、active 关系的未完成步骤,以及解绑的 `pending_rekey`/`pending_agent_md`/`pending_upload`。owner 从本地身份存储重新加载已托管的 subject signer;尚未取得材料时重发绑定响应,让 subject 重新发出托管通知。托管密码和下载地址不写入公开状态。
476
+
477
+ ## 6. owner 代签名与上传 `agent.md`
478
+
479
+ owner 只有在拿到 subject identity 后才执行代签名上传:
480
+
481
+ 1. 用解密得到的 subject 私钥对关系版完整内容签名;
482
+ 2. 使用 owner 私钥生成 `X-AUN-AgentMD-Owner-Authorization`,调用 Name Service 的 `PUT /agent.md`;该上传不使用 owner bearer token;
483
+ 3. 在本地记录上传结果;
484
+ 4. owner 上传成功后发送 `agent_md.updated`;subject SDK 收到后下载并同步本地缓存。
485
+
486
+ 因此 agent.md 的内容签名者是 subject,上传授权者是 owner。subject 自行上传时 Name Service 从 bearer token 取得上传者 AID;owner 代上传时 SDK 不使用 bearer token,而携带 `X-AUN-AgentMD-Owner-Authorization`。该授权将目标 AID、上传者、正文摘要、时间戳、nonce 和 owner 签名绑定;Name Service 从经验证的 owner 证书取得上传者 AID,并校验授权及 ownership proof,不能只相信 frontmatter。owner 或 subject 属于外域时,Name Service 通过 Gateway 的 `gateway.resolve_verified_aid_cert` 获取并校验证书链和 OCSP。
487
+
488
+ 服务端上传验证要求:
489
+
490
+ - `agent.md` 的主体签名有效,签名证书属于 subject;
491
+ - owner 代上传时要求 subject 与 owner 两份 ownership 签名都有效;self-owner 只要求 subject 签名;subject 自行上传时允许 proof 不完整;
492
+ - `agent.md` 主体签名证书及 proof 中已提供的 ownership 签名证书在上传验证时必须为 `active_signing`;
493
+ - AID、owner、proof、签名角色和证书指纹彼此匹配。
494
+
495
+ 下载端验证主体 `agent.md` 签名及其签名时间,并验证 proof 中每份 ownership 签名、签署者、证书指纹和证书在 `signed_at` 时的有效期;下载端不要求这些证书当前仍是 `active_signing`。Name Service 上传验证则要求文件签名证书及 proof 中已有的签名证书在上传时均为 `active_signing`,并检查各 ownership 签名的 `signed_at` 落在证书有效期内。
496
+
497
+ ```mermaid
498
+ sequenceDiagram
499
+ participant O as owner SDK
500
+ participant N as subject Name Service
501
+ participant S as subject SDK
502
+ O->>O: 读取已托管的 subject 私钥和证书
503
+ O->>O: 用 subject identity 签署 agent.md
504
+ O->>O: 用 owner identity 签署上传授权
505
+ O->>N: PUT /agent.md(subject 内容签名、owner 签名的上传授权头)
506
+ N->>N: 验证上传者确为该 subject 的 owner
507
+ N->>N: 验证完整 ownership proof 和所有相关 active_signing 证书
508
+ N->>N: 验证 subject 文件签名,保存 agent.md
509
+ N-->>O: 上传结果和 ETag
510
+ O-->>S: agent_md.updated
511
+ S->>N: 下载 agent.md
512
+ N-->>S: agent.md
513
+ S->>S: 分别验证文件与 ownership,同步本地缓存
514
+ ```
515
+
516
+ 文件有效性与 ownership 完整有效性是两个层面:subject 可自行签名并上传带有 owner 声明或不完整 proof 的 `agent.md`;Name Service 会校验其中已提供的每一份 ownership 签名,但不因 proof 不完整而拒绝 subject 自身上传。owner 代上传必须同时具备托管 identity 和完整有效关系;不完整 proof 不授予该权限。
517
+
518
+ ## 7. SDK 消息拦截与状态
519
+
520
+ SDK 收到 `aun.ownership.v1` 后先做以下检查:
521
+
522
+ - 当前 AID 必须是 subject 或 owner;
523
+ - sender 必须是关系另一方;
524
+ - `request_id` 必须非空;除 `bind.request` 外,消息的 `request_id` 和 `proof_id` 必须匹配本地同一关系记录,且该记录不能仍待应用确认或已拒绝;
525
+ - `proof_id`、双方 AID、role、signer_aid 必须匹配;
526
+ - 用对端证书验证签名;
527
+ - 验证失败时吞掉该 ownership 消息,不投递到应用层。
528
+
529
+ 本地状态仅用于展示和编排:`pending` 表示本地记录仍在绑定流程中,`active` 由 SDK 根据签名和协议消息在本地计算,`pending_rekey`、`pending_agent_md`、`pending_upload` 表示解绑恢复阶段,`released` 表示解绑后的名片已收敛,`legacy_unbound` 表示尚无本地关系记录。各 SDK 将 proof 和状态写入本地 AID metadata,但这不是服务端事务状态或上传成功回执;进程重启后 SDK 会自动恢复上述 pending 阶段。SDK 在 ownership 消息验证失败或处理失败时仍拦截该消息,不投递给应用层。
530
+
531
+ ## 8. 与其它服务的边界
532
+
533
+ | 组件 | 责任 |
534
+ | --- | --- |
535
+ | SDK | 生成声明和签名、发送/拦截 P2P、上传/下载 escrow、owner 代签和本地同步 |
536
+ | Message/Gateway | 按现有消息协议转发加密 P2P,不解析 ownership 业务 |
537
+ | Storage | 保存 subject 加密 identity,执行 subject 授予 owner 的对象 ACL |
538
+ | Name Service | 保存 `agent.md`,校验上传 token、主体签名和 ownership proof;不保存 ownership 关系台账 |
539
+ | Auth/CA | 提供已有 AID、token 和证书验证能力;不新增 ownership RPC,不维护关系状态 |
540
+
541
+ 应用层只调用 SDK 的绑定方法和状态查询方法,不直接调用 Auth ownership RPC,也不直接消费 `aun.ownership.v1` 消息。
542
+
543
+ ## 9. 当前实现边界
544
+
545
+ - 服务端不维护 ownership 台账,也不提供换 owner RPC。当前 owner 被服务端保存的 `agent.md` 锁定;清空或更换 owner 的普通上传会被拒绝,必须先由原 owner 发起 `release.request` 并上传带 `ownership_release` 的无 owner 文档。SDK 本地记录仍按 subject/owner AID 对保存,应用层应以 `getOwner()` 返回的 active 关系为当前关系。
546
+ - 四端都允许绑定发起方通过 API 提供自己的 `extensions`;应用层接受绑定请求时也可通过 `acceptOwnershipRequest(request_id, { extensions })` 为本端声明提供扩展字段。双方扩展字段独立,不要求相同。
547
+ - owner authorization 校验目标、上传者、正文摘要、时间窗、nonce 字段和 owner 签名;当前 Name Service 没有持久化 nonce 重放记录,因此时间窗内的重放防护不由该 nonce 单独保证。
548
+ - owner 得到 subject 私钥后可代表 subject 生成签名。加密、subject Storage ACL 和加密 P2P 用于限制传输与读取对象,不改变该授权本身的能力范围。
549
+ - 会话约定的其它 Storage ACL 或证书备份由 owner 授权、由 agent 自愿配合;当前 ownership 实现只为加密 identity escrow 对象写入 subject 授予 owner 的 `r` ACL,没有通用备份目录、备份 ACL 生命周期或额外备份 RPC。AID 已可由 SDK 加载/寻址后,应用层通过 `bindAid`/`bindOwner` 编排关系;Auth 注册流程不属于 ownership 协议,也不应通过裸 ownership RPC 完成绑定。
550
+
551
+ ## 10. 实现索引
552
+
553
+ - Go:`go/ownership_client.go`、`go/ownership_protocol.go`、`go/ownership_proof.go`、`go/agent_md_manager.go`
554
+ - Python:`python/src/aun_core/client.py`、`python/src/aun_core/ownership.py`、`python/src/aun_core/ownership_protocol.py`、`python/src/aun_core/agent_md.py`
555
+ - TypeScript:`ts/src/client.ts`、`ts/src/ownership-proof.ts`、`ts/src/agent-md.ts`
556
+ - JavaScript:`js/src/client.ts`、`js/src/ownership-proof.ts`、`js/src/agent-md.ts`
557
+ - Name Service:`../extensions/services/nameservice/go/internal/httpserver/agentmd.go`、`agent_md_schema.go`
558
+ - 测试:`python/tests/test_ownership_proof.py`、`python/tests/e2e_test_ownership.py`、`go/ownership_proof_test.go`、`ts/tests/unit/client-agent-md-api.test.ts`、`js/tests/unit/client-agent-md-api.test.ts`、`tests/cross-sdk/cases.single-domain.json`
559
+