@agentunion/fastaun 0.5.20 → 0.5.22
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 +104 -0
- package/_packed_docs/CHANGELOG.md +104 -0
- package/_packed_docs/INDEX.md +59 -34
- package/_packed_docs/KITE_DOCS_GUIDE.md +59 -52
- 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
- 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
- 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
- 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
- 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 +307 -67
- package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +41 -15
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +1433 -1392
- package/_packed_docs/protocol/08-AUN-E2EE.md +17 -12
- package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +30 -8
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/211.md +2 -0
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.1.md +33 -22
- 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
- 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
- package/_packed_docs/sdk/0.5.22-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +212 -0
- package/_packed_docs/sdk/0.5.22-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +199 -0
- package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +1 -1
- package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +5 -1
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +64 -64
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +4 -1
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +42 -39
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +163 -14
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +48 -47
- package/_packed_docs/sdk/09-group-rpc-manual.md +15 -2
- package/_packed_docs/sdk/09-message-rpc-manual.md +250 -160
- package/_packed_docs/sdk/09-storage-rpc-manual.md +64 -7
- package/_packed_docs/sdk/09-/345/207/255/350/257/201/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +73 -0
- package/_packed_docs/sdk/09-/347/273/204/347/273/207/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +90 -0
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +33 -25
- package/_packed_docs/sdk/INDEX.md +67 -33
- package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/2272.1.md +74 -57
- 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 +312 -300
- 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 +322 -382
- 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 -708
- package/_packed_docs/sdk/Ownership2.1/350/257/246/347/273/206/350/256/276/350/256/241.md +28 -20
- 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 +190 -97
- 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 +158 -127
- package/dist/agent-md-schema.js +6 -4
- package/dist/agent-md-schema.js.map +1 -1
- package/dist/agent-md.d.ts +22 -2
- package/dist/agent-md.js +92 -68
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +13 -0
- package/dist/aid-store.js +50 -15
- package/dist/aid-store.js.map +1 -1
- package/dist/auth.d.ts +1 -0
- package/dist/auth.js +22 -2
- package/dist/auth.js.map +1 -1
- package/dist/cert-utils.d.ts +1 -0
- package/dist/cert-utils.js +13 -0
- package/dist/cert-utils.js.map +1 -1
- package/dist/client/delivery.d.ts +87 -1
- package/dist/client/delivery.js +1387 -139
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/group-state.js +3 -0
- package/dist/client/group-state.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts +4 -1
- package/dist/client/rpc-pipeline.js +149 -37
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts +12 -2
- package/dist/client/v2-e2ee.js +831 -304
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +26 -2
- package/dist/client.js +412 -68
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/events.d.ts +18 -1
- package/dist/events.js +148 -9
- package/dist/events.js.map +1 -1
- package/dist/facades.d.ts +43 -1
- package/dist/facades.js +363 -7
- package/dist/facades.js.map +1 -1
- package/dist/group-fs.d.ts +1 -0
- package/dist/group-fs.js +37 -19
- package/dist/group-fs.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/keystore/aid-db.d.ts +6 -1
- package/dist/keystore/aid-db.js +184 -42
- package/dist/keystore/aid-db.js.map +1 -1
- package/dist/keystore/index.d.ts +14 -0
- package/dist/keystore/local-token-store.d.ts +9 -1
- package/dist/keystore/local-token-store.js +79 -14
- package/dist/keystore/local-token-store.js.map +1 -1
- package/dist/org-protocol.d.ts +46 -0
- package/dist/org-protocol.js +802 -12
- package/dist/org-protocol.js.map +1 -1
- package/dist/ownership-v21.d.ts +36 -5
- package/dist/ownership-v21.js +168 -52
- package/dist/ownership-v21.js.map +1 -1
- package/dist/ownership-workflow.d.ts +24 -2
- package/dist/ownership-workflow.js +682 -41
- package/dist/ownership-workflow.js.map +1 -1
- package/dist/secret-store/file-store.js +84 -0
- package/dist/secret-store/file-store.js.map +1 -1
- package/dist/seq-tracker.d.ts +1 -0
- package/dist/seq-tracker.js +2 -2
- package/dist/seq-tracker.js.map +1 -1
- package/dist/storage/lowlevel.d.ts +6 -0
- package/dist/storage/lowlevel.js +24 -7
- package/dist/storage/lowlevel.js.map +1 -1
- package/dist/storage/read-cache.d.ts +70 -0
- package/dist/storage/read-cache.js +625 -0
- package/dist/storage/read-cache.js.map +1 -0
- package/dist/storage/vfs.d.ts +2 -0
- package/dist/storage/vfs.js +50 -15
- package/dist/storage/vfs.js.map +1 -1
- package/dist/tools/cross-sdk-agent.d.ts +86 -3
- package/dist/tools/cross-sdk-agent.js +758 -46
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.d.ts +3 -0
- package/dist/transport.js +104 -46
- package/dist/transport.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/v2/e2ee/encrypt-group.js +1 -0
- package/dist/v2/e2ee/encrypt-group.js.map +1 -1
- package/dist/v2/e2ee/encrypt-p2p.js +1 -0
- package/dist/v2/e2ee/encrypt-p2p.js.map +1 -1
- package/dist/v2/e2ee/types.d.ts +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -1,382 +1,322 @@
|
|
|
1
|
-
# Ownership 2.1 SDK 开发与移植指南
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
|
16
|
-
|
|
|
17
|
-
|
|
|
18
|
-
|
|
|
19
|
-
|
|
|
20
|
-
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
|
39
|
-
|
|
|
40
|
-
|
|
|
41
|
-
|
|
|
42
|
-
|
|
|
43
|
-
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
| `
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
|
73
|
-
|
|
|
74
|
-
|
|
|
75
|
-
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
|
162
|
-
|
|
|
163
|
-
|
|
|
164
|
-
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
|
175
|
-
|
|
|
176
|
-
|
|
|
177
|
-
|
|
|
178
|
-
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
`
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
|
214
|
-
|
|
|
215
|
-
|
|
|
216
|
-
|
|
|
217
|
-
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
|
266
|
-
|
|
|
267
|
-
|
|
|
268
|
-
|
|
|
269
|
-
|
|
|
270
|
-
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
|
315
|
-
|
|
|
316
|
-
|
|
|
317
|
-
|
|
|
318
|
-
|
|
|
319
|
-
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
Client `_connectOnce` 通过 `_safeAsync(_resumeOwnershipAfterConnect())` 异步安排身份检查、注册意图和 Workflow 恢复。`await connect()` 不等于所有 Ownership 待办已经恢复完成;实现和应用应以对应结果/事件及 NS 新鲜事实判断。
|
|
324
|
-
|
|
325
|
-
## 11. 三种流程与 self-owner
|
|
326
|
-
|
|
327
|
-
| 流程 | 默认编排和最终依据 |
|
|
328
|
-
| --- | --- |
|
|
329
|
-
| 绑定 | 发起方保存意图和 request;接收方保存同意;owner 用 declareSubaid 发布 `v+1`;sub 用 declareOwneraid 自签 PUT;NS 验收后各端新鲜确认。 |
|
|
330
|
-
| 释放 | 原 owner 用 revokeSubaid 条件发布当前版本 `v` 的 release;NS 动态确认 `v/unlocked`,不另存关系或递增版本;通知 sub,字段与旧文件分别清理。真实权威不存在同样可确认该声明释放。 |
|
|
331
|
-
| 转移 | 原 owner 发 request;新 owner 与 sub 同意;原 owner 用 transferOwneraid 发布旧版本授权;新 owner 发布 `v+1` declare;sub 自签提交 `v+1`;NS 条件提交目标名片,随后从两份权威材料确认及条件清理旧文件,不另存关系或证据表。 |
|
|
332
|
-
|
|
333
|
-
审批阶段不写协议文件。默认编排给出易恢复的步骤顺序,协议本身允许各方乱序独立发布;NS 不维护跨方 prepare 或等待任务。转移授权绑定旧关系、指定新 owner、目标版本及有效期,不依赖另外两方预交目标文件或摘要。TypeScript 首次授权采用本地 3600 秒,持久保存实际 expires_at;恢复不延长它。
|
|
334
|
-
|
|
335
|
-
释放后的 sub 自动清理只使用本端明确 accept、包含 sub 角色、本人已签 agent 中 owner/sub/被释放的完整 statement(含 declaration_id、版本)完全匹配的原 bind/transfer 记录;转移历史匹配目标 owner。收到 release 通知时,因发布响应丢失仍 pending 的原任务也可提供该授权;无控制消息时,仅已完成历史任务的恢复路径触发自动清理,即使没有 relation.confirmed,也须新鲜核对权威释放事实。清理原件、全文摘要和原 CAS 单独持久保存,保持历史 completed 及原完成证据。字段已清空时不签写;响应丢失复用原件/条件,全文、ETag及已知提交 ETag 均对应原清理提交时只观察确认,冲突保留待办。没有该授权且仍有旧字段时,任务保持 pending 并发 action_required;acceptOwnershipRequest/rejectOwnershipRequest 不接受 release 任务,应用可通过已有名片 API 明确签署清理文件。
|
|
336
|
-
|
|
337
|
-
若新鲜有效名片的关系字段已经清空,sub 只有以本任务持久清理原件、摘要及原 CAS,或本人明确 accept 的匹配原 bind/transfer.release_cleanup,精确核对当前 NS 原文、摘要、ETag及已知提交 ETag 后,才可仅观察本任务清理完成,无需再签写或审批;空字段本身不证明本任务完成或本端同意。原 owner 的释放任务可早已 completed,历史绑定/转移 completed 也保持原记录;当前关系检查返回 `unbound`,响应版本为 `0`,任务版本仍为 `v`。NS 不保存释放终局或历史版本上界;后续绑定和旧任务恢复须重新核对完整文件与原条件。
|
|
338
|
-
|
|
339
|
-
self-owner 为 owner_aid 等于 sub_aid,同一身份按两个角色分别签自己的 owner.md 和 agent.md;不减少文件、签名或 NS 验收要求,不添加特殊状态。应用本端发起可覆盖本端角色意愿,SDK 不向自己发 P2P;转移中 sub 与新 owner 重合时合并对同一 AID 的请求和决定。
|
|
340
|
-
|
|
341
|
-
self-owner → 外部 owner 仍需当前身份的原 owner 授权及目标 agent.md,外部新 owner 的目标 owner.md;外部 owner → self-owner 仍需原外部 owner 授权及 sub 的两个目标文件。原/新 owner 相同不是有效转移;已有外部锁不能凭两个 self-owner 文件绕过。
|
|
342
|
-
|
|
343
|
-
## 12. 普通/群名片、注册与兼容边界
|
|
344
|
-
|
|
345
|
-
普通 2.1 名片更新保留当前完整 owner 和 statement,使用新鲜 NS 原 ETag 与本人当前签名上传,不递增关系版本。已有普通 legacy owner-only、proof 或 2.0 关系的普通名片入口允许仅更新正文;owner、ownership、ownership_proof、ownership_release 的字段存在性、类型和值必须完整保留,新 metadata 和外层签名执行当前上传规则,不由普通更新新建旧绑定或自动迁入 2.1。旧 SDK 的 owner 变更另走隔离的 legacy RPC/operation ID 兼容入口,只激活旧 `ownership_proof`,不覆盖已存现代声明,不生成 2.1 lock/version/consensus。NS 接受名片后再通过受限可信 nameservice 内部 `storage.put_object` 原子同步 `{sub_aid}:/agent.md` 原始签名副本,无需客户端 HTTP 会话;内部镜像只能写本域 `default/agent.md`,不能写删 `owner.md`。副本失败不回滚关系。正文普通更新会改变文件 ETag,即使关系版本不变也要重新同步;副本不能替代 NS 作为授权依据。
|
|
346
|
-
|
|
347
|
-
四 SDK 普通 `downloadAgentMd`/`download_agent_md` 及文件验签兼容历史 aid-only、无 frontmatter 的已签正文、实体自签及旧关系材料;历史尾签允许 16/64 hex 的 DER/SPKI 指纹、前缀省略、冒号和大小写,时间戳前导零及 CN 去首尾空白/忽略大小写仅适用于 agent.md 历史读取。签名原字节、实际 signer、指纹、证书链及签署时间仍须验证;现代 Group/Org 即使在兼容读取中也要求严格完整 DER 证书指纹、owner 与 entity_cert_fingerprint,主签 cert_fingerprint 必须匹配实体指纹,已出现但无效的指纹不得回退 legacy。旧 Group 读取仅限 type=group、恰一个签名块、无 entity_cert_fingerprint 且主 signer_aid 缺省或等于实体 AID;Org 不开放,上传不采用这些读取宽松规则。读取兼容的证书查询/缓存与通用 Auth、消息及当前 Ownership 验证隔离。`verification.ownership_status` 保留 legacy proof 展示语义,不是 2.1 新鲜共识或授权结果;文件验签成功不代表当前关系,仍须调用 `checkOwnershipConsensus` 及本语言对应方法,业务执行端自行新鲜授权。
|
|
348
|
-
|
|
349
|
-
普通名片候选先通过本地 schema/外层签名验证,在首次远端 preflight 前独立持久保存私有 `local_draft_content`;不覆盖远端 content/ETag。持有本地私钥的自有身份默认 resolve 优先该稿,返回 unverified、in_sync=false、source.agent_md_fetched=false;显式 download/forceRefresh 仍读取远端权威内容并保留草稿,服务端确认对应候选提交成功后才清稿。失败稿仅本地保留,普通 initial 失败稿同样需要应用显式重试;重连即使发现普通 pending 也不自动重传。`AgentMdManager._uploadPrepared` 取得可靠 NS 条件后,仍在 PUT 前持久保存 signedContent、pending_condition 和 pending_relation(原 owner、完整 statement、relation_version、lock)。显式重试既有 pending 时,`resumePendingUpload` **先检查持久原条件,再读取远端**;缺条件保留原元数据及原错误,即使远端同字节也不清待办。2.1 正文更新核对原版本、锁、owner 和完整 statement;受限 legacy 正文更新另保存可信 base 全文、摘要、原 ETag 及全部旧关系快照,核对 base/candidate/remote 的存在性、类型和值,缺上下文不得补造。当前原文与提交 ETag 均对应原提交时只观察确认,否则仅在原 CAS 和关系仍匹配时重传原 blob,不换条件或重签;关系改变、远端消失或已被 2.1 接管则冲突并保留 pending。其它缺原上下文的旧待办仅允许版本 0/unlocked 的初始关系;Ownership 2.1 任务、消息及 outbox 仍由其既有机制恢复。
|
|
350
|
-
|
|
351
|
-
Group/Org 名片失败稿及 pending 保留实体命名空间中的完整多签原文、原 CAS、固定 owner 和实体证书指纹,由应用显式重试,post-connect/重连不隐式 PUT。重试先验证完整原件及当前 owner、状态和证书代际,原条件完整且同代际原文/ETag 已确认提交时只观察完成。转移、rekey 或解散后停止旧代际待办,不更换身份、指纹或条件重签。取消实体 V2 授权后,不再保存、刷新或检查其额外授权及过期窗口;普通文件签名与当前证书检查保留。专属 create/transfer 自身 checkpoint 恢复机制不变。
|
|
352
|
-
|
|
353
|
-
普通主体注册指定 owner 时,[aid-store.ts](../../ts/src/aid-store.ts) 先保存 `protocol=2.1` 的 registration_intent 和固定 operation_id;可靠初始化只发布本人无 owner 名片。初次连接由 `_resumeRegistrationIntent` 复用同一 operation_id 进入绑定,注册成功不是关系已成立。Group/Org 的身份准备由专属生命周期使用,不建立通用注册 owner 意图;已有关系/不可靠读取不能作为重新初始化或清空关系的依据。
|
|
354
|
-
|
|
355
|
-
旧 `ownership_proof/ownership_release`、只有 owner 字符串而缺少完整 2.1 statement 的文件不能自动降格为 unbound,也不能用旧 records 解锁。TypeScript `OwnershipFiles.verifyFile` 明确拒绝 legacy;`bindAid/bindOwner/releaseOwnership` 抛出带 `stringCode=unsupported_protocol` 的异常,`getOwner/getOwnershipStatus` 仍读取 legacy records,不能作为 2.1 当前关系查询。升级必须明确核验原权威事实,不借迁移清空版本或 owner 锁。
|
|
356
|
-
|
|
357
|
-
业务执行端仍须认证调用者、目标 sub、权限范围和新鲜共识,绑定 token/ACL 到完整关系声明及其版本并检查当前有效性;清理后版本可重复,不能单凭版本识别关系;客户端事件或布尔值不是授权证明。敏感操作执行前保存完整文件与验证证据。托管私钥和凭据交接由应用另行处理,NS 转移不自动撤销旧私钥、证书、token 的身份能力,也不代表业务交接已经完成。
|
|
358
|
-
|
|
359
|
-
## 13. 跨语言 TDD 与有序验收
|
|
360
|
-
|
|
361
|
-
移植从共同向量开始,再接文件层、持久 Workflow 和真实 Client 通路;先用失败断言固定边界,再实现该边界。不要只用当前语言生成的数据验证自己,也不要以纯 Workflow mock 代替实际收件/连接接线。
|
|
362
|
-
|
|
363
|
-
共同文件是 [tests/vectors/ownership_v21/vectors.json](../../tests/vectors/ownership_v21/vectors.json),测试向量位于顶层 `documents` 键下;当前包含 **119 个完整文件、51 个消息、24 个六态入口**,固定 verification_time 为 `1791524400`,材料范围标为静态单元夹具。`raw_base64` 必须解码为完整原文;文件解析预期与完整验签预期分别检查。
|
|
364
|
-
|
|
365
|
-
TypeScript 消费入口为 [tests/conformance/ownership_v21.test.ts](../../ts/tests/conformance/ownership_v21.test.ts);内部行为参考 [ownership-v21.test.ts](../../ts/tests/unit/ownership-v21.test.ts)、[ownership-workflow.test.ts](../../ts/tests/unit/ownership-workflow.test.ts)、[client-agent-md-api.test.ts](../../ts/tests/unit/client-agent-md-api.test.ts)。随机 ECDSA 不要求各端生成相同签名值,要求签名格式、覆盖字节及跨端验签一致。
|
|
366
|
-
|
|
367
|
-
| 验收顺序 | 完成后才能进入下一项的证据 |
|
|
368
|
-
| --- | --- |
|
|
369
|
-
| 1. 原始文件与密码 | 双角色、严格 JSON/YAML、字节大小、TAG、整数边界、DER 与完整文件签名;坏材料分类一致。 |
|
|
370
|
-
| 2. 权威适配 | NS 原条件/可靠 404,Storage 当前完整文件与存在性再读、可信来源,精确证书及当前吊销状态;故障不解锁。 |
|
|
371
|
-
| 3. 文件方法与六态 | 自签自传、五个内部步骤、绑定/release/权威删除/连续转移/self-owner;前后 NS 一致性。 |
|
|
372
|
-
| 4. 持久 Workflow | 每任务 CAS、审批与 outbox 原子、未决不自动批准、角色去重、固定期限、损坏完成态拒绝。 |
|
|
373
|
-
| 5. 实际 Client 通路 | 解密 JSON 原文保留、push/pull/reconnect 统一拦截、持久成功前零队列移除/游标/ACK;普通与群待办隔离。 |
|
|
374
|
-
| 6. 中断窗口 | 保存后发送前/后、owner/sub 提交后失响应、release 待确认、后续代际、过期、停止前后;原字节与原条件不变。 |
|
|
375
|
-
| 7. 网络互通 | 单域集成 → 单域 E2E → cross-sdk → pub/cn 双向联邦;轮换 sub/原 owner/新 owner,观察真实 NS、Storage、CA 和凭据身份。 |
|
|
376
|
-
| 8. 服务持久与副本 | 真实数据库中的名片原文、CAS 与同步待办原子一致;服务恢复后从两份权威材料验证关系,副本最终逐字节一致;与 SDK 恢复证据分开。 |
|
|
377
|
-
|
|
378
|
-
单元测试可以并行,但每项使用隔离的数据库、AID 和目录;共用 Docker 环境仅一个测试名额,按上表的网络顺序串行执行。服务代码改变后,先重新构建、更新对应容器并核对真实运行版本,再运行受影响的网络验收;不能用旧容器结果验收新服务代码。
|
|
379
|
-
|
|
380
|
-
运行到失败立即停止,保存用例 ID、任务固定上下文、已通过阶段、NS 版本/ETag、文件摘要及日志;修复后先重跑失败项,再从未完成阶段继续。已通过且未受修改影响的项目不重复执行。现有 runner 不存在通用 resume 参数,按 [TDD 第 11 节](Ownership2.1-TDD分阶段实施计划.md#11-测试命令与续跑方法) 的检查点方法续跑;测试环境和命令见 [AUN 测试运行指南](../aun测试运行指南.md)、[分布式指南](../aun分布式测试运行指南.md)、[公网指南](../aun公网测试运行指南.md)。对外地址使用 `{svc}.{issuer}`,Windows Python 使用 `-X utf8`。
|
|
381
|
-
|
|
382
|
-
当前通过项及未完成/受限项只以 [TDD 第 13.4 节](Ownership2.1-TDD分阶段实施计划.md#134-测试与失败续跑账本)、[第 13.6 节](Ownership2.1-TDD分阶段实施计划.md#136-四-sdk-一致性检查点) 和 [第 13.7 节复审修复验收](Ownership2.1-TDD分阶段实施计划.md#137-2026-10-11-本轮复审修复验收)及[第 13.8 节复查更正与修复边界](Ownership2.1-TDD分阶段实施计划.md#138-2026-10-13-复查更正与修复边界)的具体证据为准:共同向量和本地定向通过不表示真实浏览器联网、当前完整 JS bundle 互操作或所有 SDK 跨 PID 强杀恢复均已通过。SQLite/IndexedDB 连接重开、新建 Workflow、服务独立恢复进程和真正进程重启分别记录。新移植 SDK 应提供自己的目标平台与运行版本证据,不能继承参考实现尚未覆盖的环境结论。
|
|
1
|
+
# Ownership 2.1 SDK 开发与移植指南
|
|
2
|
+
|
|
3
|
+
面向 SDK 实现者,以 Node TypeScript `0.5.22` 工作区(未发布,发布基线 `0.5.21`)说明文件验证、权威适配、消息持久化和恢复。应用调用见 [集成指南](Ownership2.1-SDK应用集成指南.md);字段和授权以 [协议 2.1](../protocol/Ownership协议定义2.1.md) 为准,历史兼容见 [编排指南 §8](Ownership-SDK编排指南2.1.md#8-崩溃与响应丢失后的恢复)。
|
|
4
|
+
|
|
5
|
+
## 1. 实现边界与角色
|
|
6
|
+
|
|
7
|
+
关系事实仅来自 sub 在 NS 的当前 `agent.md` 和 owner 在本人 Storage 的当前 `owner.md`。sub 自签自传,owner 自签自传;owner 登录态不能代上传普通 sub 名片。NS 事务原子保存名片、CAS 和同步待办,不另建关系账本;SDK 任务只记录本端编排。
|
|
8
|
+
|
|
9
|
+
普通名片解析、外层验签与关系验证分层。正文更新保留全部关系材料的存在性、类型和值及原 CAS,不以前置共识或 owner Storage 可用为条件;关系字段变更仍执行双文件授权。
|
|
10
|
+
|
|
11
|
+
Group/Org 作为 sub 使用专属生命周期:通用任务抛出 `not_applicable`,共识返回同名结果;它们仍可按普通 owner 规则作为 owner。现代实体名片由实体主签、当前 owner token 上传,可选 owner 附签且全部验证,详见协议 §2.5。
|
|
12
|
+
|
|
13
|
+
## 2. 分层与最小依赖接口
|
|
14
|
+
|
|
15
|
+
| 层次 | TS 参考与职责 |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| 文件/共识 | [ownership-v21.ts](../../ts/src/ownership-v21.ts):严格解析、签验、`OwnershipFiles`、权威 Storage 适配。 |
|
|
18
|
+
| 编排 | [ownership-workflow.ts](../../ts/src/ownership-workflow.ts):审批、每任务 CAS、inbox/outbox、结果和清理。 |
|
|
19
|
+
| HTTP/证书 | [agent-md.ts](../../ts/src/agent-md.ts)、[auth.ts](../../ts/src/auth.ts):NS fresh/原条件 PUT、精确证书和当前吊销状态。 |
|
|
20
|
+
| Client/存储 | [client.ts](../../ts/src/client.ts)、[aid-db.ts](../../ts/src/keystore/aid-db.ts):装配身份、消息、事件、重连和持久任务。 |
|
|
21
|
+
|
|
22
|
+
文件层依赖:`currentAid/now/readAgentMdFresh/submitAgentMdRaw/readOwnerMd/writeOwnerMd/deleteOwnerMd/resolveCertificate`。读返回完整原文、存在性和权威元数据;写使用已保存原字节及原条件。各服务独立实现网络契约,不 import SDK 或其他服务源码。
|
|
23
|
+
|
|
24
|
+
以下是 SDK 内部装配片段;应用只使用集成指南中的公有 Facade:
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import { OwnershipFiles } from './ownership-v21.js';
|
|
28
|
+
import { OwnershipWorkflow } from './ownership-workflow.js';
|
|
29
|
+
const files = new OwnershipFiles(fileDeps);
|
|
30
|
+
const workflow = new OwnershipWorkflow({
|
|
31
|
+
currentAid: () => identity.aid, store: tokenStore, files,
|
|
32
|
+
send: sendEncryptedMessage, emit: emitLocalEvent,
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 3. 标识、版本与数值
|
|
37
|
+
|
|
38
|
+
| 值 | 规则 |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| AID | 完整小写;分别核对资源、证书、路径和认证身份。 |
|
|
41
|
+
| operation/declaration ID | 小写 UUIDv4;任务 ID 与各文件声明 ID 独立。 |
|
|
42
|
+
| 格式版本 | 名片为语义版本字符串;statement.version 为整数 `2`;NS 协议头为 `2.1`。 |
|
|
43
|
+
| 关系版本 | NS 投影 `0..9007199254740991`,statement 从 `1` 起;递增前检查溢出。 |
|
|
44
|
+
|
|
45
|
+
绑定、转移为当前可见声明 `v+1`;release 保持 `v`;sub 清空关系后投影为 `0`,重绑默认 `1`。版本不是全局代际,旧任务还须核对完整声明、原件和 CAS。双方 statement 的 version、owner、sub、relation_version 相同;declaration_id 和 declared_at 可不同。
|
|
46
|
+
|
|
47
|
+
持久保存 `base_agent_md={exists,raw,sha256,etag,statement}` 和当前/最后 owner 的 `base_owner_md={exists,raw,sha256}`;目标 owner 写前原件另存。尚未签署的本方候选可使用语义未变正文的新鲜 ETag,已签候选重试始终沿用保存的原 CAS。
|
|
48
|
+
|
|
49
|
+
## 4. 原始文件、严格解析与签名
|
|
50
|
+
|
|
51
|
+
### 4.1 容器和角色
|
|
52
|
+
|
|
53
|
+
YAML frontmatter+可选 Markdown+连续尾签块。首签前 payload 最多 4096 UTF-8 字节,整个尾签区最多 2048 字节。拒绝坏 UTF-8、非连续签块、重复字段/YAML 键、tag、锚点、别名和未知关系字段。
|
|
54
|
+
|
|
55
|
+
| 文件 | Schema 和身份 |
|
|
56
|
+
| --- | --- |
|
|
57
|
+
| `agent.md` | 基础字段 `aid/name/type/version`;owner 与 ownership 同时出现/省略,含完整 statement;主签者和认证上传者均为 sub。human 不得声明 owner。 |
|
|
58
|
+
| `owner.md` | 顶层恰为 `owner_aid/sub_aid/ownership`;路径 `owner_aid:/sub_aids/{sub_aid}/owner.md`;ownership 含 statement/action,仅 transfer_owner 另含 transfer。 |
|
|
59
|
+
|
|
60
|
+
statement 恰含 `version/declaration_id/owner_aid/sub_aid/relation_version/declared_at`。action 为 `declare/release/transfer_owner`;transfer 恰含 `new_owner_aid/target_relation_version/expires_at`,绑定 `v+1`。文件角色取自资源上下文,不取自签名 TAG;不为 owner.md 伪造名片字段。
|
|
61
|
+
|
|
62
|
+
### 4.2 数值词法不能在解析后丢失
|
|
63
|
+
|
|
64
|
+
版本只接受原始十进制整数 token;拒绝 `1.0/1e0/+1/01`、数值 tag、字符串和布尔值。JSON 解析保留重复键与 number token,YAML 校验 scalar source,再转数值。
|
|
65
|
+
|
|
66
|
+
`declared_at/expires_at/timestamp` 为 `1..9007199254740991` 的十进制正整数 Unix 秒;非法时间归 invalid。Python 排除 bool,Go 保留 JSON 数值词法;语言整数上限不能扩大协议范围。
|
|
67
|
+
|
|
68
|
+
### 4.3 签名输入和摘要分别保存
|
|
69
|
+
|
|
70
|
+
ECDSA P-256/SHA-256;签名为严格标准 Base64 的 ASN.1 DER,不能直接写 WebCrypto/P1363 的 `r||s`。首块签原始 payload,后块签之前的全部原始 prefix;不重排 YAML、换行或 Unicode。
|
|
71
|
+
|
|
72
|
+
| 保存项 | 用途 |
|
|
73
|
+
| --- | --- |
|
|
74
|
+
| 完整原文 raw | 签验、原字节重传和附签。 |
|
|
75
|
+
| 全文 SHA-256 | 包含全部签块的完整性与提交确认。 |
|
|
76
|
+
| NS 原 ETag | 原样用于 If-Match,不能用本地摘要替代。 |
|
|
77
|
+
|
|
78
|
+
agent/owner 默认 TAG 为 `AGENTMD-V2/OWNERSHIP-V2`,兼容标签以协议为准。普通两类文件主块禁止 signer_aid;附签必填,实体主块显式为实体 AID。已有附签全部验,数学失败不能降级成单签;末端删签不保证可检测。
|
|
79
|
+
|
|
80
|
+
`AIDStore.sign/verify`、agent.md 和 owner.md 复用唯一通用签验 core,业务 Schema/当前授权在外层校验。TS/JS 公共签验为 `Promise<Result>`;文件输入显式 `inputType: 'file'`,document 成功后才可原地写回。参数见 [API 手册](06-API手册.md#通用-sign--verify)。
|
|
81
|
+
|
|
82
|
+
## 5. 当前证书与吊销验证
|
|
83
|
+
|
|
84
|
+
关系验证须核对精确 AID/证书 DER 指纹、P-256、可信链、当前有效性、`active_signing` 和可靠吊销状态;通用离线数学验签不承担这些事实。签名 timestamp 须在证书有效期内,未来偏差不超过 300 秒,也不能单独证明历史授权时间。
|
|
85
|
+
|
|
86
|
+
[AuthFlow.resolveOwnershipCertificate](../../ts/src/auth.ts) 请求 authoritative PKI,并检查:
|
|
87
|
+
|
|
88
|
+
| 权威头 | 要求 |
|
|
89
|
+
| --- | --- |
|
|
90
|
+
| X-AUN-Cert-Consistency/X-AUN-Cert-Lifecycle-State | authoritative/active_signing。 |
|
|
91
|
+
| X-AUN-Cert-Fingerprint | 与请求和证书 DER 指纹精确匹配。 |
|
|
92
|
+
| X-AUN-Cert-Observed-At | RFC3339;过去 ≤30 秒,未来 ≤5 秒。 |
|
|
93
|
+
|
|
94
|
+
TS 当前使用直接 issuer 亲签的严格 OCSP DER:核对 CertID、ResponderID、签名和状态;ThisUpdate 过去 ≤30 秒,ProducedAt ≤90 秒,未来 ≤5 秒,NextUpdate 晚于当前及 ThisUpdate。网络等待后重读时钟并复核证书,整个验证窗口 ≤30 秒。未知状态、过期材料或缺权威证据为 unavailable;坏签名、吊销或非可签证书为 invalid。通用 CRL fallback 不是该 resolver 的替代证据。
|
|
95
|
+
|
|
96
|
+
## 6. NS HTTP 与六态共识
|
|
97
|
+
|
|
98
|
+
每个新 SDK NS GET/HEAD/PUT(含 fallback 和重试)携带 `X-AUN-Signature-Format: multi-v1`。fresh 再加 `X-AUN-Ownership-Check: 1`、`Cache-Control: no-cache`;TS 使用 GET,禁止自动重定向。浏览器须能读取 CORS 暴露的关系头和 ETag。
|
|
99
|
+
|
|
100
|
+
必验 `X-AUN-Ownership-Protocol: 2.1`、`X-AUN-Ownership-Version` 严格整数及 `X-AUN-Ownership-Lock: locked|unlocked`,存在时保留原 ETag。只有正确 NS 返回完整权威元数据的 404 才能解释为不存在;初始名片缺失仍不能开始绑定写入。
|
|
101
|
+
|
|
102
|
+
```mermaid
|
|
103
|
+
flowchart TD
|
|
104
|
+
A[开始计时;fresh NS 原文与元数据] --> B[严格解析,核对角色及当前证书]
|
|
105
|
+
B --> C[权威读取并验证规范 owner.md 或明确不存在]
|
|
106
|
+
C --> D{NS 元数据与文件材料冲突吗}
|
|
107
|
+
D -->|是,尚未重查| E[额外 fresh 重查一次并重验材料]
|
|
108
|
+
E --> D
|
|
109
|
+
D -->|仍冲突| U[unavailable;保留保护]
|
|
110
|
+
D -->|否| F[再次 fresh NS 核对原文、ETag、存在性、版本和锁]
|
|
111
|
+
F -->|变化或总计超过 30 秒| U
|
|
112
|
+
F -->|稳定| G[返回当前六态及权威摘要]
|
|
113
|
+
B -->|确定材料无效| I[invalid]
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
两类元数据冲突共用一次额外重查额度,不能省略最后稳定性复读。六态为 `consensus/released/unbound/single_sided/invalid/unavailable`,含义见 [应用指南 §7](Ownership2.1-SDK应用集成指南.md#7-任务完成与当前共识六态)。pending/unlocked 映射 single_sided,不授权;release 或权威缺失对应 released/v,清理后 unbound/0。转移授权过期不使旧关系失效。
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
const current = await files.checkConsensus(subAid);
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
提交使用 `submitAgentMdRaw`:已有文件仅带原 If-Match,首次创建仅带 If-None-Match=`*`;验证完整原件后 PUT,再 fresh 确认。428→unsupported_protocol,409/412→conflict,401/403→forbidden;不能去掉条件降级重试。
|
|
123
|
+
|
|
124
|
+
旧客户端普通读写仍兼容。无 multi-v1 的多签读取投影为首块并使用该表示的 ETag;完整存储不变。Vary、304、Content-Length 和 CAS 映射必须区分表示,不能把投影摘要当完整存储摘要。
|
|
125
|
+
|
|
126
|
+
## 7. Storage 权威读取、完整发布与权限
|
|
127
|
+
|
|
128
|
+
固定 `owner_aid/bucket=default/object_key=sub_aids/{sub_aid}/owner.md/consistency=authoritative`。检查认证服务来源、命名空间、存在性和观察时间;存在时严格解码完整 content 并核对 SHA,前后权威观察 ≤30 秒且一致。普通读缓存、resolve 展示快照、超时或公开下载 404 均不能证明权威不存在。
|
|
129
|
+
|
|
130
|
+
```mermaid
|
|
131
|
+
sequenceDiagram
|
|
132
|
+
participant F as 文件层
|
|
133
|
+
participant L as 本地任务库
|
|
134
|
+
participant T as owner Storage
|
|
135
|
+
F->>T: 权威读取起始原文、存在性、SHA 和对象 version
|
|
136
|
+
F->>L: 保存起始证据、签名全文及原 expected_version
|
|
137
|
+
F->>T: 写前复读,精确核对起始原件
|
|
138
|
+
F->>T: create_upload_session,携带原 expected_version
|
|
139
|
+
T-->>F: session_id 与上传 URL
|
|
140
|
+
F->>T: HTTP PUT 完整文件
|
|
141
|
+
F->>T: complete_upload,同一 session_id/expected_version
|
|
142
|
+
T->>T: 校验大小、SHA、原版本后原子替换
|
|
143
|
+
F->>T: 权威复读确认完整原文
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
创建时 expected_version=`0`,更新时为起始权威对象的正安全整数 version;三阶段 Content-Type 一致,完成时公开可读。object_id/version 不参与只读共识,但发布/删除必须具备有效版本。起始 version 一经持久保存不得追随最新值重写旧任务。
|
|
147
|
+
|
|
148
|
+
删除前 fresh 核对 NS 和本任务完整旧原件,再带最后读取且匹配原件的当前 version 条件删除;缺版本或 `-32009` 冲突即停止。只有本人可写删 owner.md,服务端须同时限制目录、移动、别名和批量入口。删除权威 owner 文件可导致释放,不是取消任务。
|
|
149
|
+
|
|
150
|
+
这些复读不是跨服务一致快照,也不保证识别同内容 ABA 或完整文件回滚。
|
|
151
|
+
|
|
152
|
+
## 8. 七个 Facade、事件与错误契约
|
|
153
|
+
|
|
154
|
+
公有接口和事件见 [应用指南 §4–5](Ownership2.1-SDK应用集成指南.md#4-七个-facade-的参数角色与结果)。内部五步为 `declareOwneraid/declareSubaid/revokeOwneraid/revokeSubaid/transferOwneraid`,不创建任务、不发起审批。
|
|
155
|
+
|
|
156
|
+
发起前匹配本端身份、发起方、操作、全部参与方和 base/target 版本:相同进行中意图复用 ID,同代际不同意图返回 conflict;终态不被迟到消息复活。任务 status 与共识 status 分开,事件在持久保存后发布。
|
|
157
|
+
|
|
158
|
+
| 结果 | 任务语义 |
|
|
159
|
+
| --- | --- |
|
|
160
|
+
| 等审批/材料、unavailable、unsupported_protocol | pending,可保留原任务重试。 |
|
|
161
|
+
| 原条件失效、目标/版本变化、授权过期 | stopped;停止前先核验目标是否已经提交。 |
|
|
162
|
+
| 确定材料 invalid/明确拒绝 | error/rejected,不自动复活。 |
|
|
163
|
+
| 目标与本任务证据精确匹配 | completed;通知和清理失败另留待办。 |
|
|
164
|
+
| 本地存储或 revision CAS 失败 | persistence_unavailable,停止副作用。 |
|
|
165
|
+
|
|
166
|
+
结果读取 code/reason/retryable;TS 异常的业务码为 `AUNError.stringCode`,数字 code 保留 RPC 语义。Storage Base64 传输封装损坏、同次权威元数据与正文摘要不一致归 unavailable;摘要匹配后确定非法的 UTF-8、字段或签名归 invalid。
|
|
167
|
+
|
|
168
|
+
## 9. P2P 载荷与实际收件拦截
|
|
169
|
+
|
|
170
|
+
控制类型固定 `aun.ownership.sdk.v1`;必含 operation_id、operation、action、sub/owner、base/target 版本,transfer 另含 new_owner。未知/缺失字段和非法整数词法拒绝;reason 仅用于 reject 或 operation.stopped。
|
|
171
|
+
|
|
172
|
+
| 消息 | 方向 |
|
|
173
|
+
| --- | --- |
|
|
174
|
+
| bind.request/accept/reject | 绑定双方;owner-first 正常成功不要求 accept 往返。 |
|
|
175
|
+
| transfer.request/ready | 原 owner → 新 owner、sub;accept/reject 反向回复。 |
|
|
176
|
+
| owner.ready | sub-first 的 owner 或 transfer 的新 owner → sub。 |
|
|
177
|
+
| relation.confirmed/sub.cleaned | bind/transfer 的 sub → 参与方;release 的 owner → sub,sub.cleaned 反向。 |
|
|
178
|
+
| operation.stopped | 已关联任务的参与方 → 其他参与方。 |
|
|
179
|
+
|
|
180
|
+
发送使用现有加密持久 `message.send`,不设 volatile TTL;来源只取消息层验证的 from_aid,不接受自发 P2P。ready/confirmed 只是提示,仍回源核对审批、固定上下文、授权和目标。
|
|
181
|
+
|
|
182
|
+
```mermaid
|
|
183
|
+
flowchart TD
|
|
184
|
+
A[push / pull / 重连 / 有序队列] --> B[解密,保留原 JSON 和已认证 from_aid]
|
|
185
|
+
B --> C{Ownership 控制类型吗}
|
|
186
|
+
C -->|否| D[普通应用消息]
|
|
187
|
+
C -->|是| E[检查词法、方向、固定任务上下文]
|
|
188
|
+
E -->|非法或不支持| F[消费控制消息,不作为聊天投递]
|
|
189
|
+
E -->|有效| G[按发送者、任务、action 去重,CAS 保存 inbox]
|
|
190
|
+
G -->|保存失败| H[抛错;保留原队列/游标,不 ACK]
|
|
191
|
+
G -->|保存成功| I[回源核验;失败保留已存待办]
|
|
192
|
+
I --> J[核验并持久保存后,才通知审批或推进]
|
|
193
|
+
J --> K[成功返回,delivery 才可移除消息、推进游标和 ACK]
|
|
194
|
+
F --> K
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Client 拦截点在 `_publishAppEvent('message.received') → _handleOwnershipMessage → receive`;解密原文由 [decrypt.ts](../../ts/src/v2/e2ee/decrypt.ts) 保留。只给 handler 写 await 不够,[delivery.ts](../../ts/src/client/delivery.ts) 的所有实际投递路径都须等待它。
|
|
198
|
+
|
|
199
|
+
```ts
|
|
200
|
+
const consumed = await workflow.receive(authenticatedFromAid, decryptedJsonText);
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
`sub.cleaned` 在保存 inbox 前额外双读 NS,须稳定 unbound/0、空关系字段且 ETag 相同;不可确认则抛错保留投递,仍有关系则消费提示但不确认清理。
|
|
204
|
+
|
|
205
|
+
## 10. 持久任务、审批与恢复
|
|
206
|
+
|
|
207
|
+
### 10.1 存储契约
|
|
208
|
+
|
|
209
|
+
TokenStore 提供 load/list/compareAndSwapOwnershipTask;不存在为 null,读取损坏与 CAS 失败为错误。新建 expectedRevision=null,更新比较原 revision 并递增。TS 使用每任务 SQLite 事务;进程内按 sub 串行,跨实例仍靠持久 CAS。
|
|
210
|
+
|
|
211
|
+
| 记录 | 必须保存 |
|
|
212
|
+
| --- | --- |
|
|
213
|
+
| 上下文/审批 | 固定任务 ID、发起方、参与 AID、角色、base/target;本端决定及各 AID 审批。 |
|
|
214
|
+
| 文件 | 起始双文件证据;本人已签全文、SHA、原 CAS;Stage 候选 raw/SHA/ETag;owner-first 提案原文/SHA。 |
|
|
215
|
+
| 转移授权 | 首次验证的完整授权摘要和实际 expires_at,恢复不替换或延期。 |
|
|
216
|
+
| inbox/outbox | 收件去重键;原回复、接收方、稳定 message_id 和发送进度。 |
|
|
217
|
+
| 完成/清理 | 真实验收状态、版本、锁、NS ETag、双文件摘要、本人的签名原件与原条件;独立清理授权和进度。 |
|
|
218
|
+
|
|
219
|
+
审批决定与回复原子保存后发送;完整签名文件和条件也先保存再发布。发件后清 outbox 失败允许原 message_id 重发,接收方幂等。已保存决定不可反转,同一 AID 的多角色合并,未决定的另一方仍可拒绝。
|
|
220
|
+
|
|
221
|
+
### 10.2 恢复顺序与失败重试
|
|
222
|
+
|
|
223
|
+
```mermaid
|
|
224
|
+
flowchart TD
|
|
225
|
+
A[恢复原身份,读取并验证原任务] --> B{记录和完成证据完整吗}
|
|
226
|
+
B -->|否| P[persistence_unavailable;保留记录]
|
|
227
|
+
B -->|是| C[按 sub 串行:processInbox → flush → 确认/推进/清理]
|
|
228
|
+
C --> D{fresh 事实与本任务原件能确认目标吗}
|
|
229
|
+
D -->|是| E[保存真实 completed 证据,补有效通知和清理]
|
|
230
|
+
D -->|依赖不可用| W[pending;保留原任务]
|
|
231
|
+
D -->|未提交目标| F{原条件、审批及期限仍有效吗}
|
|
232
|
+
F -->|待审批| G[重新通知,等待明确决定]
|
|
233
|
+
F -->|是| H[复用原签名字节与 CAS,只补未完成步骤]
|
|
234
|
+
F -->|真实冲突/过期| I[stopped;不覆盖后续文件]
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
文件发布的持久化顺序示例,省略的前后校验仍按 §4–7 执行:
|
|
238
|
+
|
|
239
|
+
```ts
|
|
240
|
+
task.files.agent = saved;
|
|
241
|
+
await task.persist();
|
|
242
|
+
const published = await fileDeps.submitAgentMdRaw(
|
|
243
|
+
task.sub_aid, saved.raw, saved.condition,
|
|
244
|
+
);
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
响应丢失先回源确认完整目标;仅同版本或某文件同 SHA 不足。已保存 published_etag 时必须匹配;尚未保存时仅在完整共识和本人原件匹配后补记。未提交且原条件有效才重传;不重签、不换 ETag、不延期。
|
|
248
|
+
|
|
249
|
+
flush 每条通知前 fresh 核对对应原/目标关系,陈旧通知持久移除,未知时保留。completed 后只补有效通知或条件清理,不重跑关系提交;历史完成不要求历史证书今天仍可签。
|
|
250
|
+
|
|
251
|
+
0.5.20/0.5.19 及更早任务保留原 operation、审批、字节和条件,不因缺后增字段一律重建。旧 expected_revision 无权威匹配证据时保持 unavailable,不能用当前 version 替代或从网络补造历史原件。reset 仅归档当前身份发起的未完成任务,保留远端文件,迟到消息不能复活。
|
|
252
|
+
|
|
253
|
+
### 10.3 CAS 冲突分类与恢复边界
|
|
254
|
+
|
|
255
|
+
| 条件层 | 结果与处理 |
|
|
256
|
+
| --- | --- |
|
|
257
|
+
| 本地 revision/浏览器 lease-fencing | persistence_unavailable;停止旧内存任务,后续恢复从存储重读。 |
|
|
258
|
+
| NS 原 If-Match/If-None-Match | 412→conflict,语义冲突也可为409;fresh 核对全文、SHA、ETag、锁、版本和本地原证据。 |
|
|
259
|
+
| Storage 原 expected_version | -32009→conflict;权威重读完整原件和版本,不刷新条件覆盖或删除。 |
|
|
260
|
+
|
|
261
|
+
远端冲突只有完整目标及本任务原证据精确匹配才可确认完成;网络未知保留 pending。真实变化停止旧写入,按当前事实重新取得明确同意并发起合法操作,不自动 merge、重签或放宽 CAS。
|
|
262
|
+
|
|
263
|
+
## 11. 三种流程与 self-owner
|
|
264
|
+
|
|
265
|
+
| 流程 | SDK 内部步骤 |
|
|
266
|
+
| --- | --- |
|
|
267
|
+
| sub-first bind | 无锁/Stage 预检 → 保存 sub 同意 → declareOwneraid Stage → owner 审批 → declareSubaid → NS fresh 验收原候选。 |
|
|
268
|
+
| owner-first bind | 无锁预检 → declareSubaid → request → sub 固定提案并同意 → declareOwneraid 直接提交。 |
|
|
269
|
+
| release | revokeSubaid 发布同版本 release → fresh 确认 → 通知 sub → 授权清理 revokeOwneraid。 |
|
|
270
|
+
| transfer | 收齐 sub/新 owner 同意 → transferOwneraid → 新 owner declareSubaid → sub declareOwneraid → fresh 确认和旧文件清理。 |
|
|
271
|
+
|
|
272
|
+
### 11.1 EC CLI 创建 sub 后,由 human owner 确认绑定
|
|
273
|
+
|
|
274
|
+
应用时序及 TS 调用见 [集成指南 §3](Ownership2.1-SDK应用集成指南.md#3-ec-cli-集成示例sub-发起human-owner-同意)。内部 Stage 分支必须保持:
|
|
275
|
+
|
|
276
|
+
```mermaid
|
|
277
|
+
flowchart LR
|
|
278
|
+
A[fresh 确认 Stage: 1] --> B[保存 sub 已同意的原件和原 CAS]
|
|
279
|
+
B --> C[条件 Stage PUT]
|
|
280
|
+
C --> D[响应确认 Stage: 1 和 pending]
|
|
281
|
+
D --> E[owner 发布匹配 declare]
|
|
282
|
+
E --> F[NS fresh CAS 清 pending,候选字节与 ETag 不变]
|
|
283
|
+
F --> G[locked;异步同步 Storage 名片副本]
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
Stage 能力由 fresh Check 响应的 `X-AUN-Ownership-Stage: 1` 确认,Stage PUT 成功也须回该头及 pending;缺失即停止。pending 不授权。owner-first 不用 Stage,审批前固定提案 raw/SHA,提交前仍须精确匹配,正常成功无 bind.accept/owner.ready 往返。拒绝只条件清理本任务未锁原件,已验收或被替换则停止。
|
|
287
|
+
|
|
288
|
+
### 11.2 owner 释放与 sub 清理
|
|
289
|
+
|
|
290
|
+
release 保持 v,owner 可在 sub 离线时凭 fresh released/v 完成。sub 已清字段时,只有本任务原件严格关联的真实 unbound/0 才能完成,不能补造 released 或历史条件;事件 relation_version 使用实际验收版本,任务 base/target 仍为 v。
|
|
291
|
+
|
|
292
|
+
### 11.3 三方连续转移
|
|
293
|
+
|
|
294
|
+
审批齐全后固定转移授权字节和 expires_at,再发布旧版本 transfer_owner、新 owner 的 v+1 declare、sub 的 v+1 名片。NS 直接切换,不经过 released;期限只限制新提交,恢复不延期。协议允许独立乱序发布,SDK 默认顺序用于恢复,NS 不维护审批任务。
|
|
295
|
+
|
|
296
|
+
### 11.4 sub 的清理授权与 self-owner
|
|
297
|
+
|
|
298
|
+
自动清理只引用本人明确 accept、含 sub 角色且本人已签完整声明完全匹配的原 bind/transfer 记录。收到释放通知时 pending 原任务也可提供授权;无消息时仅已完成历史任务的恢复触发。清理原件、SHA 和原 CAS 独立持久保存;缺授权发 action_required,release 不接受审批 Facade。
|
|
299
|
+
|
|
300
|
+
self-owner 合并本端角色和决定,不发送自 P2P,仍分别签双文件并核验;human 禁止声明 owner,原/新 owner 相同不是有效转移。清理后重绑同一 owner,先清 sub 旧声明再发布新 declare。
|
|
301
|
+
|
|
302
|
+
## 12. 普通/群名片、注册与兼容边界
|
|
303
|
+
|
|
304
|
+
- 普通名片失败稿留本地;显式重试先检查保存的条件,再回源。缺条件不能因远端同字节而清待办;正文更新保留完整关系材料。重连不自动 PUT 普通 pending。
|
|
305
|
+
- 实体 pending 保存完整多签原文、原 CAS、固定 owner 和实体证书代际,应用显式重试;转移/rekey/解散后停止旧待办。现代上传取消额外 V2 授权,旧入口按协议 §2.5 隔离兼容;专属 create/transfer checkpoint 恢复不变。
|
|
306
|
+
- fresh 实体 GET 同时发 Check、no-cache、multi-v1,验证全部签块及当前实体代际,仍为 not_applicable。独立 AIDStore 的 Python/Go 实体上传需注入权威 owner resolver,TS/JS 默认经 fresh NS/PKI 核对。
|
|
307
|
+
- 普通 agent 注册 owner 可选;有 owner 时固定 registration_intent ID,初始名片不写关系,连接后续跑绑定。注册成功不等于关系完成。
|
|
308
|
+
- 新服务端保留旧认证、普通名片和隔离 legacy owner 操作;新 SDK 2.1 操作不兼容旧服务端。旧 proof 或 metadata 不当作 unbound 或当前授权,不能借升级清空锁。
|
|
309
|
+
|
|
310
|
+
## 13. 跨语言 TDD 与有序验收
|
|
311
|
+
|
|
312
|
+
先通过 [共同向量](../../tests/vectors/ownership_v21/vectors.json),再按下表接线;TS 入口见 [conformance](../../ts/tests/conformance/ownership_v21.test.ts)、[文件测试](../../ts/tests/unit/ownership-v21.test.ts) 和 [Workflow 测试](../../ts/tests/unit/ownership-workflow.test.ts)。随机 ECDSA 不要求签名值一致,要求覆盖字节和跨端验签一致。
|
|
313
|
+
|
|
314
|
+
| 顺序 | 必验边界 |
|
|
315
|
+
| --- | --- |
|
|
316
|
+
| 文件与密码 | 双角色、严格词法、字节限制、DER、多签、当前证书;invalid/unavailable 分类。 |
|
|
317
|
+
| 权威适配 | NS 原条件/可靠不存在、Storage 完整发布/删除 CAS、fresh 稳定性和一次重查。 |
|
|
318
|
+
| 持久编排/实际收件 | 审批/outbox 原子、消息去重、持久成功前不移除队列/推进游标/ACK。 |
|
|
319
|
+
| 中断恢复 | 各提交前后丢响应、同意后断线、过期、后续关系、清理失败;原字节和原条件不变。 |
|
|
320
|
+
| 网络与持久 | 单域 → E2E → cross-SDK → 双域;轮换角色,单独记录真实进程重启和服务数据库/副本证据。 |
|
|
321
|
+
|
|
322
|
+
失败即停,修复失败项后从检查点续跑;已通过且不受影响的项不重跑。命令见 [测试指南](../aun测试运行指南.md),历史验收范围见 [TDD 账本](Ownership2.1-TDD分阶段实施计划.md)。单元通过不代替真实浏览器、跨域或跨进程恢复验收。
|