@agentunion/fastaun 0.5.21 → 0.5.23
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 +58 -1
- package/_packed_docs/CHANGELOG.md +58 -1
- package/_packed_docs/INDEX.md +469 -453
- package/_packed_docs/KITE_DOCS_GUIDE.md +169 -164
- 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 +5 -5
- 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/2112.1.md +669 -666
- 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/06-API/346/211/213/345/206/214.md +16 -0
- package/_packed_docs/sdk/09-group-rpc-manual.md +10 -0
- 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 +3 -1
- package/_packed_docs/sdk/09-/347/273/204/347/273/207/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +2 -0
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +138 -134
- package/_packed_docs/sdk/INDEX.md +255 -239
- package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/2272.1.md +939 -930
- 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 -363
- 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 -553
- 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 +4 -4
- package/_packed_docs/sdk/Ownership2.1/350/257/246/347/273/206/350/256/276/350/256/241.md +484 -480
- 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.d.ts +16 -2
- package/dist/agent-md.js +59 -23
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +1 -0
- package/dist/aid-store.js +43 -8
- package/dist/aid-store.js.map +1 -1
- package/dist/auth.d.ts +7 -0
- package/dist/auth.js +222 -70
- package/dist/auth.js.map +1 -1
- package/dist/client/delivery.d.ts +28 -0
- package/dist/client/delivery.js +399 -44
- 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.js +28 -2
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.js +109 -39
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +3 -0
- package/dist/client.js +114 -26
- package/dist/client.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/org-protocol.d.ts +11 -0
- package/dist/org-protocol.js +154 -19
- package/dist/org-protocol.js.map +1 -1
- package/dist/ownership-v21.d.ts +21 -3
- package/dist/ownership-v21.js +135 -37
- package/dist/ownership-v21.js.map +1 -1
- package/dist/ownership-workflow.d.ts +7 -2
- package/dist/ownership-workflow.js +173 -17
- package/dist/ownership-workflow.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 +21 -1
- package/dist/tools/cross-sdk-agent.js +301 -19
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.js +6 -2
- package/dist/transport.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -1,363 +1,312 @@
|
|
|
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
|
-
```ts
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
await
|
|
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
|
-
敏感业务在执行时由执行端核对当前 owner、sub、关系版本、权限范围和新鲜共识,并保存授权证据;UI 布尔值、历史完成事件和旧 token 不替代该校验。若业务使用 token/ACL,应把它们绑定到完整关系声明及其版本,并新鲜检查释放、转移后的有效性;清理后重新绑定可能再次使用版本 `1`,版本号不能单独识别关系。完整授权边界见 [协议第 6 节](../protocol/Ownership协议定义2.1.md#6-共识审计与安全边界)。
|
|
314
|
-
|
|
315
|
-
## 8. 断线与重启恢复
|
|
316
|
-
|
|
317
|
-
0.5.20、0.5.19 及更早任务按原格式及原有协议边界兼容;保留原 operation、有效审批、原签名字节和原提交条件,不能因缺少后增本地字段而一律停止或新建任务。历史适配、绑定容错和无参数 reset 的完整范围见 [编排指南第 8 节](Ownership-SDK编排指南2.1.md#8-崩溃与响应丢失后的恢复)。reset 只归档当前身份发起的未完成任务,保留原记录和远端文件,迟到消息不能复活。 旧 Owner 候选尚未发布时,原 `expected_revision` 必须有权威证据精确匹配,不能用当前 version 替代;服务未提供旧 revision 证据时保留原件及任务并返回 unavailable。目标已提交但任务仍待恢复时,只有本地原始签名候选与当前双方共识精确匹配才确认完成;缺少这些证据不能从当前网络补造历史原件或提交条件。
|
|
318
|
-
|
|
319
|
-
1. 启动时恢复原 `aunPath`、密钥解密配置、稳定设备和 slot,装载同一身份,先注册事件处理器再连接。
|
|
320
|
-
2. SDK 从自己的持久任务继续审批、已签文件和待发送通知;请求重发和响应丢失的恢复复用原字节与原提交条件。恢复先核对权威关系和本任务证据,旧任务不能覆盖后续代际。
|
|
321
|
-
3. 应用从自己的数据库恢复业务记录与 `operation_id`,幂等更新 UI。待审批请求可再次通知;已经保存的决定不重新作相反选择。
|
|
322
|
-
4. 已合法完成的历史任务可以保留 `completed`,即使当前关系已被后续释放或转移;当前状态另调 `checkOwnershipConsensus(subAid)` 获取。
|
|
323
|
-
|
|
324
|
-
当前七 Facade 没有公开“按 operation_id 查询任务”、取消任务或强制解锁接口。`getOwnershipStatus()`/`getOwner()` 读取旧 metadata,不是 2.1 任务查询或新鲜共识;cross-sdk 测试 agent 的私有存储查询也不是应用 API。因此业务层必须保存自己的任务关联和最后进度,不能依赖私有 `_tokenStore` 重建 UI。真实恢复触发点见 [AUNClient](../../ts/src/client.ts),任务恢复实现见 [OwnershipWorkflow](../../ts/src/ownership-workflow.ts)。
|
|
325
|
-
|
|
326
|
-
重复发起相同进行中操作会复用原 `operation_id`、审批、签名字节、提交条件和授权期限;匹配要求本端身份、发起方、操作、全部参与方及起始/目标关系版本一致。同代际不同进行中意图返回 conflict,不产生第二任务。拒绝、停止、不可重试 error 不复活;后续代际的新合法操作使用新任务,历史 completed 不仅凭参数相同复用。不要删除任务数据库、清除审批记录、删除 `owner.md` 或刷新条件来制造“恢复成功”;删除 owner 的权威文件本身可能导致释放,含义不是取消任务。
|
|
327
|
-
|
|
328
|
-
Group/Org 名片失败稿及 pending 保留实体命名空间中的完整多签原文、原 CAS、固定 owner 和实体证书指纹,由应用显式重试,post-connect/重连不隐式 PUT。重试先验证完整原件及当前 owner、状态和证书代际,原条件完整且同代际原文/ETag 已确认提交时只观察完成。转移、rekey 或解散后停止旧代际待办,不更换身份、指纹或条件重签。新 SDK 现代上传不再保存、刷新或检查额外 V2 授权及过期窗口;旧 V2 兼容入口仍按协议 §2.5 校验;普通文件签名与当前证书检查保留。专属 create/transfer 自身 checkpoint 恢复机制不变。
|
|
329
|
-
|
|
330
|
-
## 9. 错误处理与安全降级
|
|
331
|
-
|
|
332
|
-
错误有三种入口:Facade 抛出异常;任务结果/本地事件附带错误;共识返回 `invalid` 或 `unavailable`。抛出的 `AUNError.code` 是数字 RPC 错误码,Ownership 字符串码读取 `error.stringCode`,是否可重试读取错误实例的 `error.retryable`;正常返回的任务或共识结果则读取其 `code`、`reason`、`retryable`。
|
|
333
|
-
|
|
334
|
-
| 字符串码或状态 | 应用处理 |
|
|
335
|
-
| --- | --- |
|
|
336
|
-
| `persistence_unavailable` | 停止有副作用的编排,恢复原持久存储能力;不以新任务替代损坏的审批历史。 |
|
|
337
|
-
| `unsupported_protocol` | 暂停 2.1 变更并核对 SDK/服务能力;不回落到 legacy 代理流程。 |
|
|
338
|
-
| `owner_locked` | 当前关系已有锁;按当前 owner 的释放或转移流程处理。 |
|
|
339
|
-
| `conflict` | NS ETag、owner 原件、原 NS CAS 条件、版本、目标或审批已变化;停止旧目标并重新核对权威事实,不自动换 ETag 或起始 owner 原件。 |
|
|
340
|
-
| `forbidden` | 调用角色、身份或审批阶段不允许;不更换凭据冒用另一方。 |
|
|
341
|
-
| `operation_not_found` | 本端没有该 ID 的请求;确认身份、持久目录及 UI 关联,不由审批 API 创建任务。 |
|
|
342
|
-
| `invalid` | 输入、签名、证书或材料确定无效;已有任务为不可重试 error,不将验签失败当成服务不可用或同意。 |
|
|
343
|
-
| `unavailable` | 服务、网络或依赖不可用,包括权威元数据、正文摘要不一致及 Storage Base64 传输封装损坏;已有任务保持 pending 并可重试,首次权威预检失败不创建任务。摘要匹配后确定非法的 UTF-8、文件字段或签名归 invalid。初始名片缺失或当前证书事实无法确认均须按原因处理。 |
|
|
344
|
-
|
|
345
|
-
输入格式校验也可能抛出普通 `ValidationError`,其 `stringCode` 不一定已填;不要靠字符串码穷举替代正常异常处理。`retryable` 只提示可以恢复验证,不授权换目标、刷新期限或再发起一个新的操作。服务状态未知时,普通认证和通信可按各自能力继续,依赖 owner 权限的敏感操作须暂停。
|
|
346
|
-
|
|
347
|
-
等审批、等材料及缺少 2.1 能力同样保持 pending;版本替代、目标改变、授权过期或原条件失效为 stopped;明确拒绝为 rejected,完整目标确认才为 completed。决定停止前先核验目标是否已提交;completed 后通知或清理失败只记录错误和待办。本地任务数据库写入/CAS、租约或持久化损坏返回 `persistence_unavailable`,保持原存储状态并停止副作用;远端 NS ETag、owner 原件或原 NS CAS 条件变化归为 `conflict`。三个协议时间字段采用 `1..9007199254740991` 的十进制正整数;范围内仍执行证书、当前时钟和授权未过期校验,重试不延期。
|
|
348
|
-
|
|
349
|
-
## 10. 可选托管与旧接口迁移
|
|
350
|
-
|
|
351
|
-
托管是应用显式启用的独立能力,不是绑定、释放或转移的前提。即使应用保存身份密文,两份关系文件仍由相应身份自己签署、上传。原 owner 曾能解密 sub 私钥时,关系转移不会自动撤销它掌握的凭据、续签或恢复能力;应用需独立确认凭据隔离,并将该交接进度与 NS 关系结果分开。
|
|
352
|
-
|
|
353
|
-
| 旧入口/判断 | 当前接入方式 |
|
|
354
|
-
| --- | --- |
|
|
355
|
-
| `bindOwner(...)`/`bind_owner(...)` | sub 使用 `bindOwneraid(ownerAid)`,owner 处理本端审批。 |
|
|
356
|
-
| `bindAid(...)`/`bind_aid(...)` | owner 使用 `bindSubaid(subAid)`,sub 明确审批。 |
|
|
357
|
-
| `releaseOwnership(...)`/`release_ownership(...)` | 当前 owner 使用 `releaseSubaid(subAid)`。 |
|
|
358
|
-
| 旧 `ownership_proof`、`proof.complete`、metadata owner | 改用当前双文件和新鲜 `checkOwnershipConsensus`;旧材料不是 2.1 共识证据。 |
|
|
359
|
-
| 旧代签、代上传、默认托管或自动 rekey 流程 | 按独立身份、明确审批及应用自己的可选凭据交接接入。 |
|
|
360
|
-
|
|
361
|
-
当前这些 legacy 发起方法会抛出 `unsupported_protocol`,不是新接口的兼容别名。更换调用名称也不等于存量旧关系已经迁入 2.1;旧关系缺少可验证的当前关系事实或材料时保持原保护,迁入条件与双方重新签署需按明确方案处理,不能清空旧关系强行初始化。兼容边界见 [设计第 9 节](Ownership2.1详细设计.md#9-降级旧版及审计)。
|
|
362
|
-
|
|
363
|
-
当前实现的实际验证与限制简要查阅 [TDD 账本第 13.4 节](Ownership2.1-TDD分阶段实施计划.md#134-测试与失败续跑账本)、[第 13.6 节四 SDK 一致性检查点](Ownership2.1-TDD分阶段实施计划.md#136-四-sdk-一致性检查点) 和 [第 13.7 节复审修复验收](Ownership2.1-TDD分阶段实施计划.md#137-2026-10-11-本轮复审修复验收)。本指南的短示例按当前 TypeScript 源码核对;本地类型成立不能替代服务部署、跨端通信或真实恢复验收。
|
|
1
|
+
# Ownership 2.1 SDK 应用集成指南
|
|
2
|
+
|
|
3
|
+
面向应用开发者,按“准备身份 → 发起 → 审批 → 核验 → 恢复”接入。示例使用 Node.js TypeScript SDK `@agentunion/fastaun` 当前工作区 `0.5.22`(未发布,升级基线 `0.5.21`),Node.js ≥22.16.0;实际依赖须具有本文接口。
|
|
4
|
+
|
|
5
|
+
协议见 [Ownership 2.1](../protocol/Ownership协议定义2.1.md),SDK 内部实现见 [开发与移植指南](Ownership2.1-SDK开发与移植指南.md)。
|
|
6
|
+
|
|
7
|
+
## 1. 应用需要理解的关系边界
|
|
8
|
+
|
|
9
|
+
| 角色/材料 | 职责 |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| sub | 被管理身份;自己签署并以本人身份向 NS 提交 `agent.md`。 |
|
|
12
|
+
| owner/新 owner | 自己签署并向本人 Storage 发布 `sub_aids/{sub_aid}/owner.md`。 |
|
|
13
|
+
| NS | 根据这两份当前权威文件核验关系;Storage 中的 sub 名片副本不参与验收。 |
|
|
14
|
+
|
|
15
|
+
owner 权限不包含 sub 私钥或代签、代上传能力。普通名片更新保留全部关系字段及原 CAS;关系无效或暂不可确认只影响依赖 owner 的授权,不阻断普通名片和通信。
|
|
16
|
+
|
|
17
|
+
本流程用于普通主体;human 可作为 owner,不能作为声明 owner 的 sub。Group/Org 自身使用专属创建、解散和强制 rekey 转让流程:任务方法抛出 `not_applicable`,共识方法返回同名状态。它们仍可按普通 owner 规则管理其他 sub。
|
|
18
|
+
|
|
19
|
+
## 2. 接入前提与能力检查
|
|
20
|
+
|
|
21
|
+
- 各端具有自己的私钥、有效证书和客户端;`load()` 成功后仍检查私钥。
|
|
22
|
+
- sub 的初始 `agent.md` 已在 NS 可读;部署具备 NS 2.1、权威 Storage、P2P 和持久任务能力。共识查询成功不代表所有发布能力可用。
|
|
23
|
+
- 固定可写的 `aunPath`、解密 seed、设备和 slot;任务保存在 `{aunPath}/AIDs/{aid}/aun.db`,重启沿用原数据。
|
|
24
|
+
- 启用 TLS 校验并配置可信根;`rootCaPath` 用于 AUN 证书验证,Node.js HTTPS 信任仍须单独正确配置。外部地址使用 `ns.{issuer}`、`st.{issuer}`。
|
|
25
|
+
|
|
26
|
+
## 3. EC CLI 集成示例:sub 发起,human owner 同意
|
|
27
|
+
|
|
28
|
+
EC CLI 当前尚未接入 Ownership 2.1;以下是 EC/Evolcore 运行层和 owner App 后端需要接入的流程。两端各运行自己的客户端;已有客户端直接复用。
|
|
29
|
+
|
|
30
|
+
### 3.1 EC CLI 创建 sub 身份
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
ec aid new helper.agentid.pub --aun-path "<EC持久目录>" --format json
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
本例不指定 owner。检查 `agentmdUploaded`;未发布成功时先用现有 `ec aid agentmd put` 重试。扫码绑定和本地 `owners[]` 不代表 Ownership 共识。
|
|
37
|
+
|
|
38
|
+
### 3.2 两端分别装载自己的身份
|
|
39
|
+
|
|
40
|
+
`config` 提供固定的 `aunPath/encryptionSeed/slotId/rootCaPath`。sub 沿用 EC 原配置(当前 seed 为 `evol`),owner 使用自己的独立存储。
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { AIDStore, AUNClient } from '@agentunion/fastaun';
|
|
44
|
+
const store = new AIDStore({ ...config, verifySsl: true });
|
|
45
|
+
const loaded = store.load(aid);
|
|
46
|
+
if (!loaded.ok) throw new Error(loaded.error.message);
|
|
47
|
+
if (!loaded.data.aid.isPrivateKeyValid()) throw new Error('本身份私钥不可用');
|
|
48
|
+
const client = new AUNClient(loaded.data.aid);
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
两端先订阅再连接。下文 `saveMessage`、`updateView`、`saveTask` 为应用自己的消息持久处理、界面更新和业务任务保存函数。
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
function watch(client: AUNClient): void {
|
|
55
|
+
client.on('message.received', payload => saveMessage(payload));
|
|
56
|
+
for (const event of ['ownership.action_required', 'ownership.progress',
|
|
57
|
+
'ownership.completed', 'ownership.rejected', 'ownership.stopped', 'ownership.error']) {
|
|
58
|
+
client.on(event, payload => updateView(event, payload));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`0.5.22` 至少需要 `message.received/message.recalled/message.batch` 中一种普通消息订阅才启动后台 P2P 拉取;已有订阅直接复用。消息处理须完成持久交付后返回,不能用空回调 ACK。仅订阅 `ownership.*` 不够;控制消息由 SDK 内部消费,仍遵守队列背压。
|
|
64
|
+
|
|
65
|
+
### 3.3 owner App 先订阅审批,再连接
|
|
66
|
+
|
|
67
|
+
`readApproval` 从通用事件载荷中校验并提取操作、参与方、版本和 `operation_id`;`showApproval` 展示这些字段,仅在用户点击后调用回调,并处理异步错误。
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
ownerClient.on('ownership.request', payload => {
|
|
71
|
+
const request = readApproval(payload);
|
|
72
|
+
showApproval(request, async accept => {
|
|
73
|
+
const task = accept
|
|
74
|
+
? await ownerClient.acceptOwnershipRequest(request.operation_id)
|
|
75
|
+
: await ownerClient.rejectOwnershipRequest(request.operation_id, '用户拒绝');
|
|
76
|
+
await saveTask(task);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
watch(ownerClient);
|
|
83
|
+
await ownerClient.connect({ auto_reconnect: true });
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
收件回调不等待用户决定;按 `operation_id` 幂等展示,不因重连重复审批或改变已保存的决定。
|
|
87
|
+
|
|
88
|
+
### 3.4 EC/Evolcore 的 sub 发起绑定
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
watch(subClient);
|
|
92
|
+
await subClient.connect({ auto_reconnect: true });
|
|
93
|
+
const task = await subClient.bindOwneraid('owner.agentid.pub');
|
|
94
|
+
await saveTask(task);
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
```mermaid
|
|
98
|
+
sequenceDiagram
|
|
99
|
+
participant S as sub SDK
|
|
100
|
+
participant N as sub NS
|
|
101
|
+
participant O as human owner App
|
|
102
|
+
participant T as owner Storage
|
|
103
|
+
S->>N: fresh 确认无锁及 Stage 能力
|
|
104
|
+
S->>S: 保存同意、签名原件和原 CAS
|
|
105
|
+
S->>N: Stage 条件提交 agent.md
|
|
106
|
+
N-->>S: pending / v+1 / unlocked
|
|
107
|
+
S->>O: 加密 bind.request
|
|
108
|
+
O->>O: 核验并保存请求,用户点击同意
|
|
109
|
+
O->>T: 本人发布匹配的 owner.md
|
|
110
|
+
O->>N: fresh 检查双文件
|
|
111
|
+
N-->>O: consensus / locked
|
|
112
|
+
O-->>S: 提示结果;sub 可离线后恢复
|
|
113
|
+
S->>N: fresh 核验目标及本人原件后完成
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
sub 发起即表达本端同意,不再调用审批方法。Stage 只保存待确认名片,此时公共共识为 `single_sided`;owner 同意并发布后,NS 可直接验收已有候选,sub 无需再次 PUT。
|
|
117
|
+
|
|
118
|
+
### 3.5 首次注册时携带 owner 的替代分支
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
const registered = await store.register('helper.agentid.pub', {
|
|
122
|
+
type: 'agent', owner: 'owner.agentid.pub',
|
|
123
|
+
});
|
|
124
|
+
if (!registered.ok) throw new Error(registered.error.message);
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
这是显式 `bindOwneraid` 的替代入口。注册先初始化无关系名片并保存固定 ID 的意图,连接后 SDK 续跑绑定,owner 仍须审批;不要再发起另一绑定。省略 owner 只注册普通 agent;`registered: true` 不表示关系成立。
|
|
128
|
+
|
|
129
|
+
### 3.6 通用签验与多签名片
|
|
130
|
+
|
|
131
|
+
```ts
|
|
132
|
+
const signed = await store.sign(aid, text, { format: 'document' });
|
|
133
|
+
if (!signed.ok || !signed.data.signed) throw new Error('签名失败');
|
|
134
|
+
const verified = await store.verify(aid, signed.data.signed, { format: 'document' });
|
|
135
|
+
if (!verified.ok || !verified.data.valid) throw new Error('验签失败');
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
默认 `raw` 为 detached 签名;文件输入须显式 `inputType: 'file'`,附签用 `append: true`。验签检查全部已有签块,数学验签不等于当前证书或 owner 授权。签名不发布文件;完整参数见 [API 手册](06-API手册.md#通用-sign--verify)。
|
|
139
|
+
|
|
140
|
+
## 4. 七个 Facade 的参数、角色与结果
|
|
141
|
+
|
|
142
|
+
| 方法 | 本端角色/结果 |
|
|
143
|
+
| --- | --- |
|
|
144
|
+
| `bindOwneraid(ownerAid)` | sub 发起绑定。 |
|
|
145
|
+
| `bindSubaid(subAid)` | owner 发起绑定,sub 审批。 |
|
|
146
|
+
| `releaseSubaid(subAid)` | 当前 owner 释放,不要求 sub 在线。 |
|
|
147
|
+
| `transferSubaid(subAid, newOwnerAid)` | 当前 owner 发起,sub 和新 owner 审批。 |
|
|
148
|
+
| `acceptOwnershipRequest(operationId)` | 同意本端已验证的 bind/transfer 请求。 |
|
|
149
|
+
| `rejectOwnershipRequest(operationId, reason?)` | 拒绝同一请求。 |
|
|
150
|
+
| `checkOwnershipConsensus(subAid?)` | 只读当前共识;省略参数检查本端 AID。 |
|
|
151
|
+
|
|
152
|
+
前六项返回 `Promise<OwnershipTaskResult>`,包含 `operation_id`、参与方、base/target 版本及 `status/step`;status 为 `pending/completed/rejected/stopped/error`。共识查询返回独立的 `OwnershipConsensusResult`。
|
|
153
|
+
|
|
154
|
+
保存业务记录与 `operation_id` 的对应关系。Promise 返回、ACK、审批通过都不是完成;`completed` 表示本端已核验本次目标,后续清理错误不撤销该结果。没有公开按 ID 查询任务、取消或强制解锁接口。
|
|
155
|
+
|
|
156
|
+
## 5. 审批与本地事件接入 UI
|
|
157
|
+
|
|
158
|
+
| 本地事件 | 处理 |
|
|
159
|
+
| --- | --- |
|
|
160
|
+
| `ownership.request` | 展示已验证请求,等待用户或明确策略决定。 |
|
|
161
|
+
| `ownership.action_required` | sub 清理旧关系字段需要明确授权。 |
|
|
162
|
+
| `ownership.progress` | 更新阶段。 |
|
|
163
|
+
| `ownership.completed` | 保存本任务完成记录;当前关系另查共识。 |
|
|
164
|
+
| `ownership.rejected/stopped/error` | 展示拒绝、停止或错误;完成后的清理错误单独显示。 |
|
|
165
|
+
|
|
166
|
+
载荷直接传入回调,没有 `event.data` 包装;包含任务字段及 `local_roles`,request 另含可信 `requester_aid`。按任务 ID、事件、step 幂等更新;`relation_version` 是本任务实际验收版本,不能替代当前查询。事件字段见 [编排指南 §2.6](Ownership-SDK编排指南2.1.md#26-本地事件与完成依据)。
|
|
167
|
+
|
|
168
|
+
## 6. 关系操作流程
|
|
169
|
+
|
|
170
|
+
### 6.1 绑定:按发起方分流
|
|
171
|
+
|
|
172
|
+
sub-first 见 §3.4;owner-first 如下:
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
const task = await ownerClient.bindSubaid('helper.agentid.pub');
|
|
176
|
+
await saveTask(task);
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
```mermaid
|
|
180
|
+
sequenceDiagram
|
|
181
|
+
participant O as owner SDK
|
|
182
|
+
participant T as owner Storage
|
|
183
|
+
participant S as sub SDK
|
|
184
|
+
participant N as sub NS
|
|
185
|
+
O->>N: fresh 确认无锁
|
|
186
|
+
O->>T: 按原条件发布 owner.md
|
|
187
|
+
O->>S: bind.request
|
|
188
|
+
S->>S: 验证并固定提案全文/SHA,用户明确同意
|
|
189
|
+
S->>N: 直接条件提交 agent.md,不使用 Stage
|
|
190
|
+
N->>T: 核对当前声明
|
|
191
|
+
N-->>S: consensus / locked
|
|
192
|
+
S-->>O: 提示结果;owner 自行 fresh 核验完成
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
绑定目标版本为当前可见声明 `v+1`,无声明时从 `1` 开始。只有可靠无锁状态可发起;`invalid/unavailable` 不能当作无锁。owner-first 正常成功无需 `bind.accept/owner.ready` 往返。
|
|
196
|
+
|
|
197
|
+
拒绝仅清理仍属于本任务、未锁定且原文/摘要/CAS 匹配的候选或邀请;不能删除已验收文件。释放后重绑同一 owner 前,先清除 sub 的旧声明,避免覆盖释放依据。
|
|
198
|
+
|
|
199
|
+
### 6.2 释放:原 owner 发起,sub 可以离线
|
|
200
|
+
|
|
201
|
+
```ts
|
|
202
|
+
const task = await ownerClient.releaseSubaid('helper.agentid.pub');
|
|
203
|
+
await saveTask(task);
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
```mermaid
|
|
207
|
+
flowchart LR
|
|
208
|
+
A[原 owner 发起] --> B[发布同版本 v 的 release]
|
|
209
|
+
B --> C[NS fresh 确认 released / v]
|
|
210
|
+
C --> D[owner 完成;sub 可离线]
|
|
211
|
+
D --> E[sub 回源确认释放]
|
|
212
|
+
E --> F{有匹配的本人历史同意吗}
|
|
213
|
+
F -->|有| G[本人条件清理 agent.md]
|
|
214
|
+
F -->|没有| H[action_required:应用明确决定清理]
|
|
215
|
+
H --> G
|
|
216
|
+
G --> I[unbound / 0]
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
释放不递增版本。权威确认 owner 文件不存在也可证明释放,网络错误或普通 404 不可。自动清理须匹配本人已同意的原 bind/transfer 完整声明;否则应用明确决定后,用本人 `store.uploadAgentMd(subAid, content)` 清除旧关系字段。release 不接受 accept/reject 审批。
|
|
220
|
+
|
|
221
|
+
字段已空不能单独认领某任务完成;SDK 仍核对本任务原件和提交证据。关系释放、sub 字段清理、旧 owner 文件清理分别展示。
|
|
222
|
+
|
|
223
|
+
### 6.3 三方转移
|
|
224
|
+
|
|
225
|
+
```ts
|
|
226
|
+
const task = await ownerClient.transferSubaid('helper.agentid.pub', 'next.agentid.pub');
|
|
227
|
+
await saveTask(task);
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
```mermaid
|
|
231
|
+
sequenceDiagram
|
|
232
|
+
participant O as 原 owner
|
|
233
|
+
participant S as sub
|
|
234
|
+
participant N as 新 owner
|
|
235
|
+
participant NS as sub NS
|
|
236
|
+
O->>S: transfer.request
|
|
237
|
+
O->>N: transfer.request
|
|
238
|
+
S-->>O: 明确同意
|
|
239
|
+
N-->>O: 明确同意
|
|
240
|
+
O->>O: 发布指定目标、v+1 和固定期限的转移授权
|
|
241
|
+
N->>N: 验证授权,发布 v+1 owner.md
|
|
242
|
+
S->>NS: 本人条件提交目标 agent.md
|
|
243
|
+
NS-->>S: 核验三方材料,直接从 v 切到 v+1
|
|
244
|
+
S-->>O: 提示结果,各端自行 fresh 核验
|
|
245
|
+
S-->>N: 提示结果,各端自行 fresh 核验
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
审批未齐不发布授权;任一待审批方拒绝则停止未提交流程。授权过期不自动解除旧关系,恢复不延期、不换目标,也不改成“先释放再绑定”。
|
|
249
|
+
|
|
250
|
+
### 6.4 自拥有与角色重合
|
|
251
|
+
|
|
252
|
+
同一 AID 的多个角色合并为一次决定,不给自己发 P2P;双文件签署和 NS 核验仍执行。`sub.bindOwneraid(subAid)` 建立 self-owner;外部 owner 转给 sub 时,sub 同时审批 `sub/new_owner` 两个角色。human 禁止 self-owner,原 owner 与新 owner 相同不是有效转移。
|
|
253
|
+
|
|
254
|
+
## 7. 任务完成与当前共识六态
|
|
255
|
+
|
|
256
|
+
```ts
|
|
257
|
+
const current = await ownerClient.checkOwnershipConsensus('helper.agentid.pub');
|
|
258
|
+
if (current.status === 'consensus' && current.owner_aid === 'owner.agentid.pub') {
|
|
259
|
+
showBound(current);
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
| status | 当前含义 |
|
|
264
|
+
| --- | --- |
|
|
265
|
+
| `consensus` | 当前双文件、签名、身份及关系版本匹配。 |
|
|
266
|
+
| `released` | sub 仍保留声明 v,owner 已释放;旧 owner 不再获权。 |
|
|
267
|
+
| `unbound` | 当前有效名片无关系声明,版本 0。 |
|
|
268
|
+
| `single_sided` | 单方准备或 Stage 待确认,不能授权。 |
|
|
269
|
+
| `invalid` | 材料确定无效,不能授权。 |
|
|
270
|
+
| `unavailable` | 当前事实不可确认,保留保护并等待。 |
|
|
271
|
+
|
|
272
|
+
Group/Org 的 `not_applicable` 不属于六态。先判断 status,不能把占位版本 0/unlocked 当成无锁证据。无目标上下文的查询也不能枚举独立 owner 邀请。
|
|
273
|
+
|
|
274
|
+
普通下载的 `verification.ownership_status` 是 legacy 展示字段;当前授权使用 fresh 共识。敏感操作由执行端核对调用者、sub、owner、权限范围及完整声明;清理后可再次出现版本 1,版本号不是全局关系标识。
|
|
275
|
+
|
|
276
|
+
## 8. 断线与重启恢复
|
|
277
|
+
|
|
278
|
+
```mermaid
|
|
279
|
+
flowchart LR
|
|
280
|
+
A[恢复原身份、目录、设备和 slot] --> B[订阅后连接]
|
|
281
|
+
B --> C[SDK 读取原任务、审批、签名字节和 CAS]
|
|
282
|
+
C --> D{fresh 核对结果}
|
|
283
|
+
D -->|完整目标与本任务证据匹配| E[确认原任务完成]
|
|
284
|
+
D -->|尚未提交且原条件有效| F[只补未完成步骤]
|
|
285
|
+
D -->|依赖暂不可用| G[保留 pending]
|
|
286
|
+
D -->|原件或关系已变化| H[停止旧写入]
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
`connect()` 返回不表示恢复已完成。应用恢复自己的业务任务记录并幂等更新 UI;SDK 复用原 operation,不重新绑定或转移。合法历史 completed 保留,当前关系另查。
|
|
290
|
+
|
|
291
|
+
`resetOwnershipTask()` 仅归档当前身份发起的未完成任务,不删除远端候选、不解绑或解锁;普通断线不用 reset。历史任务和三类 CAS 冲突见 [移植指南 §10](Ownership2.1-SDK开发与移植指南.md#10-持久任务审批与恢复)。
|
|
292
|
+
|
|
293
|
+
## 9. 错误处理与安全降级
|
|
294
|
+
|
|
295
|
+
| 错误 | 处理 |
|
|
296
|
+
| --- | --- |
|
|
297
|
+
| `persistence_unavailable` | 恢复原存储,停止副作用,不删除数据库伪造新任务。 |
|
|
298
|
+
| `unsupported_protocol` | 核对 SDK/服务能力,不回退 legacy 写入。 |
|
|
299
|
+
| `owner_locked` | 由当前 owner 释放或转移。 |
|
|
300
|
+
| `conflict` | fresh 核对已提交目标;真实变化则停止,不换 CAS 强写。 |
|
|
301
|
+
| `forbidden/operation_not_found/invalid` | 检查角色、身份、任务关联或材料,不盲重试。 |
|
|
302
|
+
| `unavailable` | 保留原任务和字节,依赖恢复后继续核验。 |
|
|
303
|
+
|
|
304
|
+
错误可能来自异常、任务/事件或共识结果。结果读取 `code/reason/retryable`;抛出的 `AUNError` 读取 `stringCode/retryable`,其 `code` 是数字 RPC 码。`retryable` 不授权换目标、重签或延期。
|
|
305
|
+
|
|
306
|
+
## 10. 可选托管与旧接口迁移
|
|
307
|
+
|
|
308
|
+
托管和凭据交接由应用独立决定;关系转移不会自动撤销旧 owner 已掌握的私钥、证书或 token。
|
|
309
|
+
|
|
310
|
+
旧 `bindOwner/bindAid/releaseOwnership` 在新 SDK 中返回 `unsupported_protocol`;分别改用 `bindOwneraid/bindSubaid/releaseSubaid`。旧 proof、metadata owner 和旧查询不能证明 2.1 共识。新服务端保留旧 SDK 隔离兼容,新 SDK 的 2.1 操作不兼容旧服务端;不能清空旧关系强行迁入。
|
|
311
|
+
|
|
312
|
+
Group/Org 名片由实体主签、当前 owner token 上传;失败稿保留完整多签原文、固定 owner/证书代际及原 CAS,应用显式重试,重连不自动 PUT。格式见 [协议 §2.5](../protocol/Ownership协议定义2.1.md#25-grouporg-名片的实体主签与-owner-上传)。
|