@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.
- package/CHANGELOG.md +176 -78
- package/_packed_docs/CHANGELOG.md +176 -78
- package/_packed_docs/INDEX.md +288 -269
- package/_packed_docs/KITE_DOCS_GUIDE.md +101 -95
- package/_packed_docs/agent.md/SCHEMA.md +7 -7
- 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/agent.md//350/277/234/347/250/213agent.md/347/274/223/345/255/230/344/270/216etag/351/200/217/344/274/240/346/226/271/346/241/210.md +11 -11
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +372 -331
- package/_packed_docs/protocol/08-AUN-E2EE.md +17 -12
- package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +676 -676
- package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +8 -12
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/211.md +445 -0
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.0.md +161 -0
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.1.md +666 -0
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2113.0.md +233 -0
- package/_packed_docs/protocol/agent.md/SCHEMA.md +1 -1
- 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/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 +70 -63
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +43 -40
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +179 -19
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +50 -49
- package/_packed_docs/sdk/09-group-rpc-manual.md +261 -254
- package/_packed_docs/sdk/09-message-rpc-manual.md +253 -160
- package/_packed_docs/sdk/09-storage-rpc-manual.md +18 -26
- 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
- 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
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +105 -92
- package/_packed_docs/sdk/INDEX.md +197 -167
- package/_packed_docs/sdk/Ownership-SDK/345/256/236/347/216/260/346/214/207/345/215/227.md +169 -0
- package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/227.md +349 -0
- package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/2272.1.md +930 -0
- package/_packed_docs/sdk/Ownership-SDK/351/233/206/346/210/220/346/214/207/345/215/227.md +270 -0
- package/_packed_docs/sdk/Ownership2.1-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +363 -0
- package/_packed_docs/sdk/Ownership2.1-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +553 -0
- package/_packed_docs/sdk/Ownership2.1-TDD/345/210/206/351/230/266/346/256/265/345/256/236/346/226/275/350/256/241/345/210/222.md +708 -0
- package/_packed_docs/sdk/Ownership2.1/350/257/246/347/273/206/350/256/276/350/256/241.md +480 -0
- package/_packed_docs/sdk/Ownership/347/256/241/347/220/206/344/270/223/351/242/230.md +559 -0
- package/_packed_docs/sdk/ProtectedHeaders/347/224/250/346/263/225/344/270/223/351/242/230.md +299 -0
- package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +173 -0
- package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +211 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273SDK/345/256/236/347/216/260/347/247/273/346/244/215/346/214/207/345/215/227.md +331 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273SDK/351/233/206/346/210/220/346/214/207/345/215/227.md +207 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/344/273/243/347/240/201/345/256/241/346/237/245/346/212/245/345/221/212.md +252 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/345/256/236/346/226/275/350/256/241/345/210/222.md +156 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/346/226/271/346/241/210.md +273 -0
- package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/350/257/246/347/273/206/350/256/276/350/256/241.md +211 -0
- package/dist/agent-md-schema.d.ts +16 -4
- package/dist/agent-md-schema.d.ts.map +1 -1
- package/dist/agent-md-schema.js +65 -30
- package/dist/agent-md-schema.js.map +1 -1
- package/dist/agent-md.d.ts +35 -3
- package/dist/agent-md.d.ts.map +1 -1
- package/dist/agent-md.js +384 -150
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +59 -0
- package/dist/aid-store.d.ts.map +1 -1
- package/dist/aid-store.js +202 -16
- package/dist/aid-store.js.map +1 -1
- package/dist/aid.d.ts +4 -1
- package/dist/aid.d.ts.map +1 -1
- package/dist/aid.js +24 -42
- package/dist/aid.js.map +1 -1
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +89 -18
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +6410 -1848
- package/dist/cert-utils.d.ts +50 -1
- package/dist/cert-utils.d.ts.map +1 -1
- package/dist/cert-utils.js +123 -56
- package/dist/cert-utils.js.map +1 -1
- package/dist/client/delivery.d.ts +108 -16
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js +1411 -184
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts +4 -1
- package/dist/client/rpc-pipeline.d.ts.map +1 -1
- package/dist/client/rpc-pipeline.js +203 -117
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts +22 -3
- package/dist/client/v2-e2ee.d.ts.map +1 -1
- package/dist/client/v2-e2ee.js +1312 -684
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +23 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +419 -101
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +8 -6
- package/dist/crypto.js.map +1 -1
- package/dist/events.d.ts +24 -3
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +171 -29
- package/dist/events.js.map +1 -1
- package/dist/facades.d.ts +42 -1
- package/dist/facades.d.ts.map +1 -1
- package/dist/facades.js +368 -12
- package/dist/facades.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/keystore/index.d.ts +14 -1
- package/dist/keystore/index.d.ts.map +1 -1
- package/dist/keystore/indexeddb-identity-store.d.ts +4 -0
- package/dist/keystore/indexeddb-identity-store.d.ts.map +1 -1
- package/dist/keystore/indexeddb-identity-store.js +30 -13
- package/dist/keystore/indexeddb-identity-store.js.map +1 -1
- package/dist/keystore/indexeddb-shared.d.ts +19 -2
- package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
- package/dist/keystore/indexeddb-shared.js +193 -6
- package/dist/keystore/indexeddb-shared.js.map +1 -1
- package/dist/keystore/indexeddb-token-store.d.ts +15 -2
- package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
- package/dist/keystore/indexeddb-token-store.js +308 -27
- package/dist/keystore/indexeddb-token-store.js.map +1 -1
- package/dist/org-protocol.d.ts +45 -0
- package/dist/org-protocol.d.ts.map +1 -1
- package/dist/org-protocol.js +827 -21
- package/dist/org-protocol.js.map +1 -1
- package/dist/ownership-v21.d.ts +43 -9
- package/dist/ownership-v21.d.ts.map +1 -1
- package/dist/ownership-v21.js +183 -81
- package/dist/ownership-v21.js.map +1 -1
- package/dist/ownership-workflow.d.ts +36 -1
- package/dist/ownership-workflow.d.ts.map +1 -1
- package/dist/ownership-workflow.js +610 -89
- package/dist/ownership-workflow.js.map +1 -1
- package/dist/seq-tracker.d.ts +2 -0
- package/dist/seq-tracker.d.ts.map +1 -1
- package/dist/seq-tracker.js +3 -2
- package/dist/seq-tracker.js.map +1 -1
- package/dist/tools/cross-sdk-agent.d.ts +61 -3
- package/dist/tools/cross-sdk-agent.d.ts.map +1 -1
- package/dist/tools/cross-sdk-agent.js +524 -45
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.d.ts +4 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +64 -30
- 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
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# Ownership SDK集成指南
|
|
2
|
+
|
|
3
|
+
本文是 legacy 集成记录,实现基准为 2026-10-09 工作区代码,不代表当前 Ownership 2.1。当前应用接入、审批及新鲜共识见 [Ownership 2.1 SDK 应用集成指南](Ownership2.1-SDK应用集成指南.md);下文旧 proof、自动 escrow 和代上传流程不能作为 2.1 接入方式。
|
|
4
|
+
|
|
5
|
+
## 1. TypeScript快速集成
|
|
6
|
+
|
|
7
|
+
### 1.1 加载双方身份
|
|
8
|
+
|
|
9
|
+
示例使用Node.js SDK `@agentunion/fastaun`,当前源码要求Node.js >= 22.16.0。owner与subject已经注册,分别持有自己的证书和私钥;将示例AID、数据目录及密钥保护种子替换为应用已有配置。两端通常运行在不同进程,下面并列展示各自的接入代码。
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @agentunion/fastaun
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { AIDStore, AUNClient } from '@agentunion/fastaun';
|
|
17
|
+
|
|
18
|
+
function loadClient(store: AIDStore, aid: string): AUNClient {
|
|
19
|
+
const loaded = store.load(aid);
|
|
20
|
+
if (!loaded.ok) throw new Error(loaded.error.message);
|
|
21
|
+
return new AUNClient(loaded.data.aid);
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
const ownerStore = new AIDStore({ aunPath: './.aun-owner', encryptionSeed: process.env.OWNER_KEY_SEED ?? '', verifySsl: true });
|
|
27
|
+
const subjectStore = new AIDStore({ aunPath: './.aun-subject', encryptionSeed: process.env.SUBJECT_KEY_SEED ?? '', verifySsl: true });
|
|
28
|
+
const owner = loadClient(ownerStore, 'owner.agentid.pub');
|
|
29
|
+
const subject = loadClient(subjectStore, 'subject.agentid.pub');
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`OWNER_KEY_SEED`、`SUBJECT_KEY_SEED`是本示例的应用环境变量,用于读取已有身份的保护种子。`AUNClient`接收`AID`对象;`store.load()`是同步方法,返回`Result`,联网的绑定方法则是异步方法。
|
|
33
|
+
|
|
34
|
+
### 1.2 接入应用审批,再连接
|
|
35
|
+
|
|
36
|
+
接收方订阅`ownership.request`。SDK已经验证申请声明,事件直接传入请求字段;应用将它接入确认界面或自己的审批逻辑。接受关系会继续自动托管subject的完整identity,其中包含私钥,审批界面应让使用者理解这项授权。
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
function subscribeRequests(client: AUNClient): void {
|
|
40
|
+
client.on('ownership.request', (payload) => {
|
|
41
|
+
const request = payload as { request_id: string; requester_aid: string };
|
|
42
|
+
console.log('待审批的ownership申请', request);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
subscribeRequests(owner);
|
|
46
|
+
subscribeRequests(subject);
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
以下函数供应用的接受/拒绝操作调用。`requestId`取自对应客户端收到的事件;`extensions`写入接受方自己的签名声明。
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
async function decideOwnership(client: AUNClient, requestId: string, accepted: boolean) {
|
|
53
|
+
if (accepted) return client.acceptOwnershipRequest(requestId, {
|
|
54
|
+
extensions: { application: 'clinic-app' },
|
|
55
|
+
});
|
|
56
|
+
return client.rejectOwnershipRequest(requestId);
|
|
57
|
+
}
|
|
58
|
+
await Promise.all([owner.connect(), subject.connect()]);
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
监听器在`connect()`前注册,便于接收连接恢复时重新发布的待审批申请。应用回调收到的是请求对象,不需要再读取一层`payload`。
|
|
62
|
+
|
|
63
|
+
### 1.3 owner发起绑定
|
|
64
|
+
|
|
65
|
+
owner应用执行:
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
const sent = await owner.bindAid('subject.agentid.pub', {
|
|
69
|
+
subjectType: 'agent',
|
|
70
|
+
requestId: 'clinic-bind-001',
|
|
71
|
+
extensions: { department: 'clinic' },
|
|
72
|
+
});
|
|
73
|
+
console.log('绑定申请发送结果', sent);
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
subject应用收到事件后,使用事件中的`request_id`调用`decideOwnership(subject, request_id, true)`或`decideOwnership(subject, request_id, false)`。接受后,SDK自动回复、发布关系名片、托管identity并推进owner代上传;应用只需完成一次审批。
|
|
77
|
+
|
|
78
|
+
`await bindAid()`表示申请的消息发送调用结束,双方关系的完成需要等待接受方确认。这个区别与IM系统的“消息发送成功”和“对方已处理”相同。
|
|
79
|
+
|
|
80
|
+
### 1.4 subject发起绑定
|
|
81
|
+
|
|
82
|
+
也可以由subject应用发起,作为上一节的另一种入口:
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
await subject.bindOwner('owner.agentid.pub', {
|
|
86
|
+
subjectType: 'agent',
|
|
87
|
+
extensions: { application: 'clinic-app' },
|
|
88
|
+
});
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
这时由owner应用处理`ownership.request`,调用`decideOwnership(owner, request_id, accepted)`。subject SDK会先尝试上传只有subject签名的关系名片,然后等待owner确认。`subjectType`是本次关系记录的类型信息;SDK修改已有名片时保留原有`type`、其它frontmatter和正文,它不是通用的类型修改入口。
|
|
92
|
+
|
|
93
|
+
### 1.5 查询本地关系与公开名片
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
const state = subject.getOwnershipStatus();
|
|
97
|
+
console.log('本地关系状态', state.status, state.proof_id);
|
|
98
|
+
console.log('本地owner与类型', subject.getOwner(), subject.getType());
|
|
99
|
+
|
|
100
|
+
const published = await subjectStore.downloadAgentMd('subject.agentid.pub');
|
|
101
|
+
if (!published.ok) throw new Error(published.error.message);
|
|
102
|
+
console.log('文件与关系验签', published.data.verification);
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
按三个结果分别判断:
|
|
106
|
+
|
|
107
|
+
| 需要判断的结果 | 观察方式 | 含义 |
|
|
108
|
+
| --- | --- | --- |
|
|
109
|
+
| 双方是否已签署 | 本地`status === 'active'`,并核对双方AID及`proof_id` | 本端已保存完整关系;self-owner为subject单签 |
|
|
110
|
+
| owner代上传及通知是否结束 | owner侧的`agent_md_uploaded`、`agent_md_notified` | owner本地编排进度,不是subject同步回执 |
|
|
111
|
+
| subject是否已同步名片 | subject侧的`agent_md_synced`;公开名片的`verification` | 文件验签结果与ownership结果分别检查;完整公开关系为`ownership_status === 'complete'` |
|
|
112
|
+
|
|
113
|
+
`getOwner()`优先返回active关系,也可能返回pending等尚未释放的记录,因此仅有owner值不足以确认绑定完成。`getOwnershipStatus()`选择一条涉及当前AID的关系并优先active;owner管理多个subject时,它不返回全量列表,应用应同时核对目标subject。
|
|
114
|
+
|
|
115
|
+
当前进度字段来自本地metadata,字段未出现通常表示该步骤尚未记录。完整proof可以先于托管和owner代上传公开;托管失败不会撤销双方已完成的签名关系。
|
|
116
|
+
|
|
117
|
+
### 1.6 self-owner与解绑
|
|
118
|
+
|
|
119
|
+
self-owner在subject本地完成:
|
|
120
|
+
|
|
121
|
+
```ts
|
|
122
|
+
await subject.bindOwner(subject.aid!);
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
该入口只生成subject签名、上传本端名片,不发送绑定申请、不托管identity,也不需要应用审批。`human`名片不允许声明owner,包括self-owner。
|
|
126
|
+
|
|
127
|
+
外部owner释放关系:
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
await owner.releaseOwnership('subject.agentid.pub');
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
subject SDK验证原关系后自动rekey、保留名片业务内容、删除`owner`和`ownership_proof`、写入`ownership_release`并上传。subject侧最终为`status: released`、`release_status: released`,公开名片的关系验签状态为`released`。
|
|
134
|
+
|
|
135
|
+
解绑方法返回的是释放消息发送结果。owner本地的`release_status: notified`表示已发起通知;当前没有释放完成的P2P回执,确认最终结果应查看subject状态或下载其公开名片。换owner时先完成释放,再重新绑定;subject没有单方解除入口。
|
|
136
|
+
|
|
137
|
+
应用业务结束、后续编排已经完成时关闭客户端:
|
|
138
|
+
|
|
139
|
+
```ts
|
|
140
|
+
await Promise.all([owner.close(), subject.close()]);
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## 2. 应用需要使用的SDK方法
|
|
144
|
+
|
|
145
|
+
| TypeScript方法 | 调用方 | 返回与边界 |
|
|
146
|
+
| --- | --- | --- |
|
|
147
|
+
| `bindAid(subjectAid, options?)` | owner | 异步;创建owner声明并发送申请 |
|
|
148
|
+
| `bindOwner(ownerAid, options?)` | subject | 异步;创建subject声明;self-owner在本地完成 |
|
|
149
|
+
| `acceptOwnershipRequest(requestId, { extensions }?)` | 申请接收方 | 异步;只处理本端待审批申请,签署本端声明并推进后续流程 |
|
|
150
|
+
| `rejectOwnershipRequest(requestId)` | 申请接收方 | 异步;拒绝申请并发送`bind.reject` |
|
|
151
|
+
| `releaseOwnership(subjectAid)` | 原owner | 异步;要求本地active关系,发送释放声明 |
|
|
152
|
+
| `getOwner()` / `getType()` / `getOwnershipStatus()` | 双方 | 同步;读取本地摘要,排除identity、托管密码和下载地址 |
|
|
153
|
+
|
|
154
|
+
绑定选项为`subjectType`、`requestId`、`extensions`,前两项也接受`subject_type`、`request_id`。默认类型为`agent`,未传请求ID时SDK生成ID;每次调用绑定方法都会创建新`proof_id`,复用`requestId`不构成整个绑定API的幂等保证。发送中断后的恢复应保留原数据目录,由SDK续跑原记录。
|
|
155
|
+
|
|
156
|
+
## 3. SDK层面的绑定编排
|
|
157
|
+
|
|
158
|
+
### 3.1 owner发起
|
|
159
|
+
|
|
160
|
+
```mermaid
|
|
161
|
+
sequenceDiagram
|
|
162
|
+
participant OA as owner应用
|
|
163
|
+
participant O as owner SDK
|
|
164
|
+
participant M as 加密P2P
|
|
165
|
+
participant S as subject SDK
|
|
166
|
+
participant SA as subject应用
|
|
167
|
+
OA->>O: bindAid(subjectAid)
|
|
168
|
+
O->>O: 签署owner声明,持久化pending
|
|
169
|
+
O->>M: bind.request
|
|
170
|
+
M->>S: 解密后拦截并验证申请
|
|
171
|
+
S->>S: 保存待审批记录
|
|
172
|
+
S->>SA: ownership.request
|
|
173
|
+
alt 应用接受
|
|
174
|
+
SA->>S: acceptOwnershipRequest(request_id)
|
|
175
|
+
S->>S: 签署subject声明,持久化active
|
|
176
|
+
S->>M: bind.response
|
|
177
|
+
M->>O: 验证subject声明,持久化active
|
|
178
|
+
S->>S: 立即发布完整proof名片,之后独立尝试identity托管
|
|
179
|
+
else 应用拒绝
|
|
180
|
+
SA->>S: rejectOwnershipRequest(request_id)
|
|
181
|
+
S->>M: bind.reject
|
|
182
|
+
M->>O: 记录rejected
|
|
183
|
+
end
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 3.2 subject发起
|
|
187
|
+
|
|
188
|
+
```mermaid
|
|
189
|
+
sequenceDiagram
|
|
190
|
+
participant SA as subject应用
|
|
191
|
+
participant S as subject SDK
|
|
192
|
+
participant N as subject Name Service
|
|
193
|
+
participant O as owner SDK
|
|
194
|
+
participant OA as owner应用
|
|
195
|
+
SA->>S: bindOwner(ownerAid)
|
|
196
|
+
S->>S: 签署subject声明,持久化pending
|
|
197
|
+
S->>N: 尝试上传不完整proof名片
|
|
198
|
+
S->>O: 加密P2P bind.request
|
|
199
|
+
O->>O: 验证并保存待审批记录
|
|
200
|
+
O->>OA: ownership.request
|
|
201
|
+
alt 应用接受
|
|
202
|
+
OA->>O: acceptOwnershipRequest(request_id)
|
|
203
|
+
O->>O: 签署owner声明,持久化active
|
|
204
|
+
O->>S: 加密P2P bind.response
|
|
205
|
+
S->>S: 验证并保存完整proof,标记active并立即发布名片
|
|
206
|
+
else 应用拒绝
|
|
207
|
+
OA->>O: rejectOwnershipRequest(request_id)
|
|
208
|
+
O->>S: 加密P2P bind.reject
|
|
209
|
+
S->>S: 记录rejected
|
|
210
|
+
end
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
双方分别签署自己的声明;`proof_id`和双方AID相同,`signed_at`和`extensions`可以不同。`ownership.request`是SDK本地应用事件,原始`aun.ownership.v1`控制消息由SDK消费。
|
|
214
|
+
|
|
215
|
+
## 4. SDK自动托管、代上传和同步
|
|
216
|
+
|
|
217
|
+
两个绑定方向在subject取得完整proof后立即发布关系名片,再独立尝试托管;发布和托管分别记录进度:
|
|
218
|
+
|
|
219
|
+
```mermaid
|
|
220
|
+
sequenceDiagram
|
|
221
|
+
participant S as subject SDK
|
|
222
|
+
participant T as subject Storage
|
|
223
|
+
participant O as owner SDK
|
|
224
|
+
participant K as owner身份存储
|
|
225
|
+
participant N as subject Name Service
|
|
226
|
+
S->>N: subject立即尝试发布完整proof名片
|
|
227
|
+
Note over S,N: 发布失败保留pending上传,不阻止托管
|
|
228
|
+
S->>S: 打包identity,生成密码并加密
|
|
229
|
+
S->>T: 上传envelope,写owner的r ACL,申请下载票据
|
|
230
|
+
S->>O: 加密P2P escrow.ready
|
|
231
|
+
O->>T: 使用票据下载加密envelope
|
|
232
|
+
O->>O: 解密,校验subject身份与密钥
|
|
233
|
+
O->>K: 导入subject identity并加密保存私钥
|
|
234
|
+
O->>O: 用subject私钥签名片,用owner私钥签上传授权
|
|
235
|
+
O->>N: PUT /agent.md,携带owner授权头
|
|
236
|
+
N->>N: 验证完整proof、上传者与subject文件签名
|
|
237
|
+
N-->>O: 上传结果与ETag
|
|
238
|
+
O->>S: 加密P2P agent_md.updated
|
|
239
|
+
S->>N: 下载、验签并保存本地名片
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
subject自行上传名片和identity托管分别尝试;一个步骤失败不会阻止另一项尝试。owner得到的是能代表subject签名的identity。名片内容签名者始终是subject,HTTP上传授权者可以是owner。
|
|
243
|
+
|
|
244
|
+
当前SDK仅为该escrow对象写入owner读取ACL;其它业务目录的授权、备份策略与清理不属于这段自动编排。跨issuer下载使用资源所在域签发的票据;同issuer下载可携带当前access token。
|
|
245
|
+
|
|
246
|
+
## 5. SDK自动解绑与中断恢复
|
|
247
|
+
|
|
248
|
+
```mermaid
|
|
249
|
+
flowchart TD
|
|
250
|
+
A[原owner签署并发送release.request] --> B[subject验证sender、release和当前关系证据]
|
|
251
|
+
B --> C[持久化release_status为pending_rekey]
|
|
252
|
+
C --> D[恢复或完成rekey并载入新身份]
|
|
253
|
+
D --> E[进入pending_agent_md]
|
|
254
|
+
E --> F[比较本地与远端尾部签名时间,选择较新名片]
|
|
255
|
+
F --> G[移除owner和proof,保留release及业务内容]
|
|
256
|
+
G --> H[持久化pending_upload及待上传内容]
|
|
257
|
+
H --> I[用新subject证书签名并上传]
|
|
258
|
+
I --> J[上传成功,标记released]
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
rekey阶段可能断开并重新连接;待处理记录和待上传名片跨重启保存。名片时间相同优先使用远端版本。若远端已经保存同一份有效release,SDK可直接收敛到released。
|
|
262
|
+
|
|
263
|
+
绑定恢复遵循已有IM消息的异步处理方式:保存待发控制消息,重连后重发;待审批申请重新发布给应用;subject重试名片发布和托管;owner从本地身份存储恢复subject signer。若owner尚未获得材料,会重发自己的绑定响应,让subject重新发送托管通知。恢复依赖同一AID的数据目录及密钥保护配置。
|
|
264
|
+
|
|
265
|
+
## 6. 实现与协议入口
|
|
266
|
+
|
|
267
|
+
- SDK移植、持久化与验收:[Ownership SDK实现指南](Ownership-SDK实现指南.md)。
|
|
268
|
+
- 消息schema、proof、agent.md和现有RPC:[Ownership协议定义](../protocol/Ownership协议定义.md)。
|
|
269
|
+
- 原专题与完整消息样例:[Ownership管理专题](Ownership管理专题.md)。
|
|
270
|
+
- 示例对应源码:[client.ts](../../ts/src/client.ts)、[aid-store.ts](../../ts/src/aid-store.ts)、[ownership-proof.ts](../../ts/src/ownership-proof.ts)、[agent-md.ts](../../ts/src/agent-md.ts)。
|