@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,300 +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
|
-
```ts
|
|
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
|
-
const
|
|
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
|
-
| `ownership.
|
|
161
|
-
| `ownership.
|
|
162
|
-
| `ownership.
|
|
163
|
-
| `ownership.
|
|
164
|
-
| `ownership.stopped` |
|
|
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
|
-
### 6.2 释放:原 owner 发起,sub 可以离线
|
|
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
|
-
|
|
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-上传)。
|