@agentunion/fastaun 0.5.23 → 0.5.24
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 +33 -0
- package/_packed_docs/CHANGELOG.md +33 -0
- package/_packed_docs/INDEX.md +27 -15
- package/_packed_docs/KITE_DOCS_GUIDE.md +22 -19
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.1.md +2 -2
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +13 -7
- package/_packed_docs/sdk/INDEX.md +21 -6
- package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/2272.1.md +49 -2
- 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 +123 -72
- 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 +173 -96
- package/dist/agent-md.d.ts +1 -1
- package/dist/agent-md.js +14 -12
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +1 -0
- package/dist/aid-store.js +34 -12
- package/dist/aid-store.js.map +1 -1
- package/dist/client.d.ts +9 -10
- package/dist/client.js +115 -94
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/keystore/aid-db.d.ts +1 -8
- package/dist/keystore/aid-db.js +46 -204
- package/dist/keystore/aid-db.js.map +1 -1
- package/dist/keystore/index.d.ts +0 -15
- package/dist/keystore/local-token-store.d.ts +1 -6
- package/dist/keystore/local-token-store.js +0 -15
- package/dist/keystore/local-token-store.js.map +1 -1
- package/dist/ownership-v21.d.ts +2 -2
- package/dist/ownership-v21.js +25 -12
- package/dist/ownership-v21.js.map +1 -1
- package/dist/ownership-workflow.d.ts +30 -59
- package/dist/ownership-workflow.js +260 -1667
- package/dist/ownership-workflow.js.map +1 -1
- package/dist/tools/cross-sdk-agent.d.ts +1 -2
- package/dist/tools/cross-sdk-agent.js +7 -14
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Ownership 2.1 SDK 应用集成指南
|
|
2
2
|
|
|
3
|
-
面向应用开发者,按“准备身份 →
|
|
3
|
+
面向应用开发者,按“准备身份 → 提交文件 → 通知/同意 → NS 验收”接入。示例使用 Node.js TypeScript SDK `@agentunion/fastaun` 当前工作区 `0.5.24`,Node.js ≥22.16.0;实际依赖须包含本文接口。
|
|
4
4
|
|
|
5
5
|
协议见 [Ownership 2.1](../protocol/Ownership协议定义2.1.md),SDK 内部实现见 [开发与移植指南](Ownership2.1-SDK开发与移植指南.md)。
|
|
6
6
|
|
|
@@ -10,17 +10,19 @@
|
|
|
10
10
|
| --- | --- |
|
|
11
11
|
| sub | 被管理身份;自己签署并以本人身份向 NS 提交 `agent.md`。 |
|
|
12
12
|
| owner/新 owner | 自己签署并向本人 Storage 发布 `sub_aids/{sub_aid}/owner.md`。 |
|
|
13
|
-
| NS |
|
|
13
|
+
| NS | 根据这两份当前权威文件验收并锁定关系;Storage 中的 sub 名片副本不参与验收。 |
|
|
14
14
|
|
|
15
15
|
owner 权限不包含 sub 私钥或代签、代上传能力。普通名片更新保留全部关系字段及原 CAS;关系无效或暂不可确认只影响依赖 owner 的授权,不阻断普通名片和通信。
|
|
16
16
|
|
|
17
|
-
本流程用于普通主体;human 可作为 owner,不能作为声明 owner 的 sub。Group/Org 自身使用专属创建、解散和强制 rekey
|
|
17
|
+
本流程用于普通主体;human 可作为 owner,不能作为声明 owner 的 sub。Group/Org 自身使用专属创建、解散和强制 rekey 转让流程:关系操作抛出 `not_applicable`,共识方法返回同名状态。它们仍可按普通 owner 规则管理其他 sub。
|
|
18
|
+
|
|
19
|
+
SDK 不维护 Ownership 任务状态机、WAL 或后台恢复,不提交独立 decisions 回执。NS 以归属事实判断冲突;锁定后,新的 accept/reject 不能改变关系,须走释放或转移。
|
|
18
20
|
|
|
19
21
|
## 2. 接入前提与能力检查
|
|
20
22
|
|
|
21
23
|
- 各端具有自己的私钥、有效证书和客户端;`load()` 成功后仍检查私钥。
|
|
22
|
-
- sub 的初始 `agent.md` 已在 NS
|
|
23
|
-
-
|
|
24
|
+
- sub 的初始 `agent.md` 已在 NS 可读;部署具备本轮 NS 2.1 验收、Stage、权威 Storage 能力。交互流程另需 P2P;本地编排不发 P2P。
|
|
25
|
+
- 保管好各身份的 `aunPath`、解密 seed 和私钥;普通长连接使用各自的设备和 slot。本地编排由 SDK 另建专属 slot 的短连接。
|
|
24
26
|
- 启用 TLS 校验并配置可信根;`rootCaPath` 用于 AUN 证书验证,Node.js HTTPS 信任仍须单独正确配置。外部地址使用 `ns.{issuer}`、`st.{issuer}`。
|
|
25
27
|
|
|
26
28
|
## 3. EC CLI 集成示例:sub 发起,human owner 同意
|
|
@@ -48,19 +50,18 @@ if (!loaded.data.aid.isPrivateKeyValid()) throw new Error('本身份私钥不可
|
|
|
48
50
|
const client = new AUNClient(loaded.data.aid);
|
|
49
51
|
```
|
|
50
52
|
|
|
51
|
-
两端先订阅再连接。下文 `saveMessage`、`updateView
|
|
53
|
+
两端先订阅再连接。下文 `saveMessage`、`updateView` 为应用自己的消息持久处理和界面更新函数,不要求应用保存 Ownership 任务。
|
|
52
54
|
|
|
53
55
|
```ts
|
|
54
56
|
function watch(client: AUNClient): void {
|
|
55
57
|
client.on('message.received', payload => saveMessage(payload));
|
|
56
|
-
for (const event of ['ownership.
|
|
57
|
-
'ownership.completed', 'ownership.rejected', 'ownership.stopped', 'ownership.error']) {
|
|
58
|
+
for (const event of ['ownership.completed', 'ownership.rejected']) {
|
|
58
59
|
client.on(event, payload => updateView(event, payload));
|
|
59
60
|
}
|
|
60
61
|
}
|
|
61
62
|
```
|
|
62
63
|
|
|
63
|
-
|
|
64
|
+
当前 TS 实现至少需要 `message.received/message.recalled/message.batch` 中一种普通消息订阅才启动后台 P2P 拉取;已有订阅直接复用。消息处理须完成持久交付后返回,不能用空回调 ACK。仅订阅 `ownership.*` 不够;控制消息由 SDK 内部消费,仍遵守队列背压。
|
|
64
65
|
|
|
65
66
|
### 3.3 owner App 先订阅审批,再连接
|
|
66
67
|
|
|
@@ -70,10 +71,10 @@ function watch(client: AUNClient): void {
|
|
|
70
71
|
ownerClient.on('ownership.request', payload => {
|
|
71
72
|
const request = readApproval(payload);
|
|
72
73
|
showApproval(request, async accept => {
|
|
73
|
-
const
|
|
74
|
+
const result = accept
|
|
74
75
|
? await ownerClient.acceptOwnershipRequest(request.operation_id)
|
|
75
76
|
: await ownerClient.rejectOwnershipRequest(request.operation_id, '用户拒绝');
|
|
76
|
-
|
|
77
|
+
updateView('ownership.result', result);
|
|
77
78
|
});
|
|
78
79
|
});
|
|
79
80
|
```
|
|
@@ -83,15 +84,15 @@ watch(ownerClient);
|
|
|
83
84
|
await ownerClient.connect({ auto_reconnect: true });
|
|
84
85
|
```
|
|
85
86
|
|
|
86
|
-
收件回调不等待用户决定;按 `operation_id`
|
|
87
|
+
收件回调不等待用户决定;按 `operation_id` 去重展示。SDK 使用经过认证的原始请求执行 accept/reject,应用不要自行拼造请求;失败按 §8 查询 NS 后重新发起。
|
|
87
88
|
|
|
88
89
|
### 3.4 EC/Evolcore 的 sub 发起绑定
|
|
89
90
|
|
|
90
91
|
```ts
|
|
91
92
|
watch(subClient);
|
|
92
93
|
await subClient.connect({ auto_reconnect: true });
|
|
93
|
-
const
|
|
94
|
-
|
|
94
|
+
const result = await subClient.bindOwneraid('owner.agentid.pub');
|
|
95
|
+
updateView('ownership.result', result);
|
|
95
96
|
```
|
|
96
97
|
|
|
97
98
|
```mermaid
|
|
@@ -101,16 +102,16 @@ sequenceDiagram
|
|
|
101
102
|
participant O as human owner App
|
|
102
103
|
participant T as owner Storage
|
|
103
104
|
S->>N: fresh 确认无锁及 Stage 能力
|
|
104
|
-
S->>S:
|
|
105
|
+
S->>S: 本次签署 agent.md,保留文件 CAS
|
|
105
106
|
S->>N: Stage 条件提交 agent.md
|
|
106
107
|
N-->>S: pending / v+1 / unlocked
|
|
107
108
|
S->>O: 加密 bind.request
|
|
108
|
-
O->>O:
|
|
109
|
+
O->>O: 核验原始请求,用户点击同意
|
|
109
110
|
O->>T: 本人发布匹配的 owner.md
|
|
110
111
|
O->>N: fresh 检查双文件
|
|
111
112
|
N-->>O: consensus / locked
|
|
112
|
-
O-->>S:
|
|
113
|
-
S->>N:
|
|
113
|
+
O-->>S: 发送结果通知;sub 无需在线或再次 PUT
|
|
114
|
+
S->>N: 应用查询当前共识并更新界面
|
|
114
115
|
```
|
|
115
116
|
|
|
116
117
|
sub 发起即表达本端同意,不再调用审批方法。Stage 只保存待确认名片,此时公共共识为 `single_sided`;owner 同意并发布后,NS 可直接验收已有候选,sub 无需再次 PUT。
|
|
@@ -124,7 +125,7 @@ const registered = await store.register('helper.agentid.pub', {
|
|
|
124
125
|
if (!registered.ok) throw new Error(registered.error.message);
|
|
125
126
|
```
|
|
126
127
|
|
|
127
|
-
这是显式 `bindOwneraid`
|
|
128
|
+
这是显式 `bindOwneraid` 的替代入口。注册先初始化无关系名片,再于本次调用内用专属短连接提交绑定并通知 owner,最后关闭连接;owner 仍须审批。省略 owner 只注册普通 agent;`registered: true` 不表示关系成立。失败后先检查已注册身份与 NS 状态,需要时显式调用 `bindOwneraid`,不等待连接后自动续跑。
|
|
128
129
|
|
|
129
130
|
### 3.6 通用签验与多签名片
|
|
130
131
|
|
|
@@ -137,7 +138,7 @@ if (!verified.ok || !verified.data.valid) throw new Error('验签失败');
|
|
|
137
138
|
|
|
138
139
|
默认 `raw` 为 detached 签名;文件输入须显式 `inputType: 'file'`,附签用 `append: true`。验签检查全部已有签块,数学验签不等于当前证书或 owner 授权。签名不发布文件;完整参数见 [API 手册](06-API手册.md#通用-sign--verify)。
|
|
139
140
|
|
|
140
|
-
## 4.
|
|
141
|
+
## 4. Facade 的参数、角色与结果
|
|
141
142
|
|
|
142
143
|
| 方法 | 本端角色/结果 |
|
|
143
144
|
| --- | --- |
|
|
@@ -145,25 +146,25 @@ if (!verified.ok || !verified.data.valid) throw new Error('验签失败');
|
|
|
145
146
|
| `bindSubaid(subAid)` | owner 发起绑定,sub 审批。 |
|
|
146
147
|
| `releaseSubaid(subAid)` | 当前 owner 释放,不要求 sub 在线。 |
|
|
147
148
|
| `transferSubaid(subAid, newOwnerAid)` | 当前 owner 发起,sub 和新 owner 审批。 |
|
|
149
|
+
| `bindLocalSubaid(subClient)` | 本地 owner 与 sub 双身份自动绑定,见 §6.5。 |
|
|
150
|
+
| `transferLocalSubaid(subClient, newOwnerClient)` | 本地旧 owner、sub、新 owner 三身份自动转移,见 §6.6。 |
|
|
148
151
|
| `acceptOwnershipRequest(operationId)` | 同意本端已验证的 bind/transfer 请求。 |
|
|
149
152
|
| `rejectOwnershipRequest(operationId, reason?)` | 拒绝同一请求。 |
|
|
150
153
|
| `checkOwnershipConsensus(subAid?)` | 只读当前共识;省略参数检查本端 AID。 |
|
|
151
154
|
|
|
152
|
-
|
|
155
|
+
除共识查询外,方法返回 `Promise<OwnershipTaskResult>`;这是保留的类型名,表示本次调用结果,包含 `operation_id`、参与方、base/target 版本及 `status/step`。共识查询返回独立的 `OwnershipConsensusResult`。
|
|
153
156
|
|
|
154
|
-
|
|
157
|
+
当前 TS 普通交互方法返回 `completed/step=local_actions`,只表示当次文件与通知动作执行完成;例如 sub 发出请求后仍可能是 `single_sided`。本地编排会额外确认目标共识。应用统一以 §7 的 NS 共识判断当前归属,不以返回值、ACK 或通知代替验收。SDK 没有待办任务查询、取消或强制解锁接口。
|
|
155
158
|
|
|
156
159
|
## 5. 审批与本地事件接入 UI
|
|
157
160
|
|
|
158
161
|
| 本地事件 | 处理 |
|
|
159
162
|
| --- | --- |
|
|
160
163
|
| `ownership.request` | 展示已验证请求,等待用户或明确策略决定。 |
|
|
161
|
-
| `ownership.
|
|
162
|
-
| `ownership.
|
|
163
|
-
| `ownership.completed` | 保存本任务完成记录;当前关系另查共识。 |
|
|
164
|
-
| `ownership.rejected/stopped/error` | 展示拒绝、停止或错误;完成后的清理错误单独显示。 |
|
|
164
|
+
| `ownership.completed` | 本次执行观察到共识,可刷新界面;当前关系另查共识。 |
|
|
165
|
+
| `ownership.rejected` | 展示对端拒绝通知;不代表 NS 回滚或解除关系。 |
|
|
165
166
|
|
|
166
|
-
|
|
167
|
+
以上为当前 TS 工作流实际发出的事件,不依赖旧 `progress/action_required/stopped/error` 事件。载荷直接传入回调,没有 `event.data` 包装;request 含操作、参与方、base/target 版本和可信 `requester_aid`,不要依赖旧 `local_roles`。`operation_id` 只关联通知与界面,不是 NS 的归属锁或决定记录。调用错误仍须处理返回的 `status/code/reason` 和异常。
|
|
167
168
|
|
|
168
169
|
## 6. 关系操作流程
|
|
169
170
|
|
|
@@ -172,8 +173,8 @@ if (!verified.ok || !verified.data.valid) throw new Error('验签失败');
|
|
|
172
173
|
sub-first 见 §3.4;owner-first 如下:
|
|
173
174
|
|
|
174
175
|
```ts
|
|
175
|
-
const
|
|
176
|
-
|
|
176
|
+
const result = await ownerClient.bindSubaid('helper.agentid.pub');
|
|
177
|
+
updateView('ownership.result', result);
|
|
177
178
|
```
|
|
178
179
|
|
|
179
180
|
```mermaid
|
|
@@ -185,22 +186,24 @@ sequenceDiagram
|
|
|
185
186
|
O->>N: fresh 确认无锁
|
|
186
187
|
O->>T: 按原条件发布 owner.md
|
|
187
188
|
O->>S: bind.request
|
|
188
|
-
S->>S:
|
|
189
|
+
S->>S: 验证当前提案,用户明确同意
|
|
189
190
|
S->>N: 直接条件提交 agent.md,不使用 Stage
|
|
190
191
|
N->>T: 核对当前声明
|
|
191
192
|
N-->>S: consensus / locked
|
|
192
|
-
S-->>O: 提示结果;owner
|
|
193
|
+
S-->>O: 提示结果;owner 查询当前共识
|
|
193
194
|
```
|
|
194
195
|
|
|
195
|
-
|
|
196
|
+
初次绑定版本从 `1` 开始;替换未锁定的候选时沿用候选版本,不因重新通知而递增。只有可靠无锁状态可发起;`invalid/unavailable` 不能当作无锁。NS 验收不以 `bind.accept` 通知到达或发起端再次在线为前提。
|
|
197
|
+
|
|
198
|
+
拒绝仅发送通知,不删除或回滚已上传文件。未锁定前,sub 可用 CAS 替换 owner 声明,以最后成功上传的 `agent.md` 为准:先声明 B 后声明 C,B 同意不能形成共识;C 同意才可验收,C 拒绝则保留单边声明。NS 锁定后,同目标 accept 可返回已完成,reject 或不同目标不能改变归属;不再维护跨设备“唯一决定”记录。
|
|
196
199
|
|
|
197
|
-
|
|
200
|
+
释放后重绑同一 owner 前,先清除 sub 的旧声明,避免覆盖释放依据。
|
|
198
201
|
|
|
199
202
|
### 6.2 释放:原 owner 发起,sub 可以离线
|
|
200
203
|
|
|
201
204
|
```ts
|
|
202
|
-
const
|
|
203
|
-
|
|
205
|
+
const result = await ownerClient.releaseSubaid('helper.agentid.pub');
|
|
206
|
+
updateView('ownership.result', result);
|
|
204
207
|
```
|
|
205
208
|
|
|
206
209
|
```mermaid
|
|
@@ -208,23 +211,21 @@ flowchart LR
|
|
|
208
211
|
A[原 owner 发起] --> B[发布同版本 v 的 release]
|
|
209
212
|
B --> C[NS fresh 确认 released / v]
|
|
210
213
|
C --> D[owner 完成;sub 可离线]
|
|
211
|
-
D --> E[sub
|
|
212
|
-
E --> F
|
|
213
|
-
F
|
|
214
|
-
|
|
215
|
-
H --> G
|
|
216
|
-
G --> I[unbound / 0]
|
|
214
|
+
D --> E[sub 收到合法释放通知]
|
|
215
|
+
E --> F[当次回源验证并条件清理 agent.md]
|
|
216
|
+
F --> G[unbound / 0]
|
|
217
|
+
D --> H[通知未处理则仍为 released,不等待后台任务]
|
|
217
218
|
```
|
|
218
219
|
|
|
219
|
-
释放不递增版本。权威确认 owner 文件不存在也可证明释放,网络错误或普通 404
|
|
220
|
+
释放不递增版本。权威确认 owner 文件不存在也可证明释放,网络错误或普通 404 不可。sub 收到合法 release 通知时,当次回源核验并用本人身份条件清理声明,不依赖历史审批任务。若通知未处理,先按 `released` 展示;当前没有公开的强制清理 Facade,不能用普通 `uploadAgentMd` 删除关系字段。release 不接受 accept/reject 审批。
|
|
220
221
|
|
|
221
|
-
|
|
222
|
+
NS 已确认 `released/unlocked` 即关系释放;sub 字段未清不恢复旧 owner 权限,清理后为 `unbound/0`。关系释放和文件清理分开展示。
|
|
222
223
|
|
|
223
224
|
### 6.3 三方转移
|
|
224
225
|
|
|
225
226
|
```ts
|
|
226
|
-
const
|
|
227
|
-
|
|
227
|
+
const result = await ownerClient.transferSubaid('helper.agentid.pub', 'next.agentid.pub');
|
|
228
|
+
updateView('ownership.result', result);
|
|
228
229
|
```
|
|
229
230
|
|
|
230
231
|
```mermaid
|
|
@@ -233,25 +234,74 @@ sequenceDiagram
|
|
|
233
234
|
participant S as sub
|
|
234
235
|
participant N as 新 owner
|
|
235
236
|
participant NS as sub NS
|
|
237
|
+
O->>O: 发布指定目标、v+1 和固定期限的转移授权
|
|
236
238
|
O->>S: transfer.request
|
|
237
239
|
O->>N: transfer.request
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
S
|
|
245
|
-
S
|
|
240
|
+
par sub 同意(无先后要求)
|
|
241
|
+
S->>NS: 验证授权,Stage 提交目标 agent.md
|
|
242
|
+
NS-->>S: 材料未齐时保留旧 active / locked / v
|
|
243
|
+
and 新 owner 同意
|
|
244
|
+
N->>N: 验证授权,发布 v+1 owner.md
|
|
245
|
+
end
|
|
246
|
+
S->>NS: 验收当前材料;任一参与方可触发检查
|
|
247
|
+
NS-->>S: 三方材料一致,原子切到新 owner / v+1
|
|
248
|
+
S-->>O: 提示结果,各端查询当前共识
|
|
246
249
|
```
|
|
247
250
|
|
|
248
|
-
|
|
251
|
+
旧 owner 先发布授权再通知。sub 与新 owner 各自上传本人文件,不要求同时在线,也没有同意时序要求。拒绝只反馈,不撤销已发布材料;授权过期或撤回不解除旧活动关系。材料未齐时 NS 保留旧 owner 锁,达成一致后原子切换,不经过“先释放再绑定”。
|
|
249
252
|
|
|
250
253
|
### 6.4 自拥有与角色重合
|
|
251
254
|
|
|
252
|
-
同一 AID
|
|
255
|
+
同一 AID 承担多个角色时,一次调用执行本人的全部文件动作,不给自己发 P2P;双文件签署和 NS 核验仍执行。`sub.bindOwneraid(subAid)` 建立 self-owner;外部 owner 转给 sub 时,sub 同时审批 `sub/new_owner` 两个角色。human 禁止 self-owner,原 owner 与新 owner 相同不是有效转移。
|
|
256
|
+
|
|
257
|
+
### 6.5 本地双身份自动绑定
|
|
258
|
+
|
|
259
|
+
Evolcore/EC CLI 同时掌握 daemon 与新 sub 的身份材料时,由 daemon 调用 `bindLocalSubaid(subClient)` 自动完成绑定,无需 P2P 或人工确认。传入两个 client 用于提供身份,不要求应用另行 connect;SDK 创建 `ownership-UUID` 专属 slot 的短连接,完成认证、发布与验收后在 `finally` 关闭,避免占用普通长连接 slot。
|
|
260
|
+
|
|
261
|
+
```ts
|
|
262
|
+
const bound = await daemonClient.bindLocalSubaid(subClient);
|
|
263
|
+
if (bound.status !== 'completed') throw new Error(bound.reason);
|
|
264
|
+
showBound({
|
|
265
|
+
sub_aid: bound.sub_aid, owner_aid: bound.owner_aid,
|
|
266
|
+
relation_version: bound.target_relation_version,
|
|
267
|
+
});
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
```mermaid
|
|
271
|
+
flowchart LR
|
|
272
|
+
A[daemon + sub 两个本地 client] --> B[SDK 创建两身份专属短连接]
|
|
273
|
+
B --> C[daemon 签署并发布 owner.md]
|
|
274
|
+
C --> D[sub 签署并条件提交 agent.md]
|
|
275
|
+
D --> E[NS 验收一致归属并锁定]
|
|
276
|
+
E --> F[返回结果,关闭短连接]
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### 6.6 本地三身份自动转移
|
|
253
280
|
|
|
254
|
-
|
|
281
|
+
当前 owner、本地 sub 和目标 owner 的身份材料都可用时,由当前 owner 调用 `transferLocalSubaid(subClient, newOwnerClient)`。SDK 为三个身份创建专属短连接,先发布原 owner 授权和新 owner 声明,再由 sub 提交名片并确认 NS 共识;不发 P2P,不经过先释放再绑定。
|
|
282
|
+
|
|
283
|
+
```ts
|
|
284
|
+
const moved = await daemonClient.transferLocalSubaid(subClient, nextAgentClient);
|
|
285
|
+
if (moved.status !== 'completed') throw new Error(moved.reason);
|
|
286
|
+
showBound({
|
|
287
|
+
sub_aid: moved.sub_aid, owner_aid: moved.new_owner_aid,
|
|
288
|
+
relation_version: moved.target_relation_version,
|
|
289
|
+
});
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
```mermaid
|
|
293
|
+
flowchart LR
|
|
294
|
+
A[旧 owner + sub + 新 owner 三个本地 client] --> B[SDK 创建三身份专属短连接]
|
|
295
|
+
B --> C[旧 owner 发布指定目标的转移授权]
|
|
296
|
+
C --> D[新 owner 签署并发布 owner.md]
|
|
297
|
+
D --> E[sub 签署并条件提交新 agent.md]
|
|
298
|
+
E --> F[NS 验收并原子切换归属]
|
|
299
|
+
F --> G[核验目标,条件清理旧授权并关闭短连接]
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
两个本地方法仅支持不同的 `type: agent` 身份,每个 client 均须有有效私钥、证书及 NS 名片。human 作为 owner 仍走 §3/§6.3 的现有确认流程;本地方法不替人同意,也不自动沿 daemon 的 owner 关系推导授权。失败后按 §8 查询 NS 再重新发起,不等待后台恢复。
|
|
303
|
+
|
|
304
|
+
## 7. 当前共识六态与完成判断
|
|
255
305
|
|
|
256
306
|
```ts
|
|
257
307
|
const current = await ownerClient.checkOwnershipConsensus('helper.agentid.pub');
|
|
@@ -271,42 +321,43 @@ if (current.status === 'consensus' && current.owner_aid === 'owner.agentid.pub')
|
|
|
271
321
|
|
|
272
322
|
Group/Org 的 `not_applicable` 不属于六态。先判断 status,不能把占位版本 0/unlocked 当成无锁证据。无目标上下文的查询也不能枚举独立 owner 邀请。
|
|
273
323
|
|
|
274
|
-
普通下载的 `verification.ownership_status` 是 legacy
|
|
324
|
+
普通下载的 `verification.ownership_status` 是 legacy 展示字段。普通 peer 名片展示可按 ETag 复用 Ownership 快照,不必轮询重检;`owner.md` 可独立变化,实际管理操作仍由 SDK/服务端回源核验当前归属、权限和文件 CAS。清理后可再次出现版本 1,版本号不是全局关系标识。
|
|
275
325
|
|
|
276
|
-
## 8.
|
|
326
|
+
## 8. 故障后查询与重新发起
|
|
277
327
|
|
|
278
328
|
```mermaid
|
|
279
329
|
flowchart LR
|
|
280
|
-
A[
|
|
281
|
-
B --> C
|
|
282
|
-
C
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
330
|
+
A[恢复本人身份,订阅后连接] --> B[查询 NS 当前共识]
|
|
331
|
+
B --> C{当前事实}
|
|
332
|
+
C -->|目标归属已锁定| D[按已完成更新界面]
|
|
333
|
+
C -->|仍无锁或只有单边声明| E[用户显式重新发起绑定]
|
|
334
|
+
C -->|仍锁定原 owner| F[需要时重新发起转移或释放]
|
|
335
|
+
C -->|已锁定其它 owner| G[停止旧请求,按当前归属处理]
|
|
336
|
+
C -->|unavailable / invalid| H[先排除依赖或材料问题]
|
|
287
337
|
```
|
|
288
338
|
|
|
289
|
-
`connect()`
|
|
339
|
+
SDK 不保存未完成操作,不在 `connect()` 后扫描任务或补发通知。若上传成功但通知失败,已提交文件仍然有效;先查 NS,目标已锁定则视为完成,否则显式重新发起。新调用有新的 `operation_id`,NS 按当前归属事实和 CAS 验收,不靠旧消息 ID 锁定关系。
|
|
290
340
|
|
|
291
|
-
`resetOwnershipTask()`
|
|
341
|
+
审批时需要经过认证的原始请求。实现可从正常消息记录重取原请求;若已不可恢复,让发起方重新发起,不重建审批任务。不要调用旧 `resetOwnershipTask()` 来期望回滚或续跑;它不再是新流程的一步。
|
|
292
342
|
|
|
293
343
|
## 9. 错误处理与安全降级
|
|
294
344
|
|
|
295
345
|
| 错误 | 处理 |
|
|
296
346
|
| --- | --- |
|
|
297
|
-
| `persistence_unavailable` | 恢复原存储,停止副作用,不删除数据库伪造新任务。 |
|
|
298
347
|
| `unsupported_protocol` | 核对 SDK/服务能力,不回退 legacy 写入。 |
|
|
299
348
|
| `owner_locked` | 由当前 owner 释放或转移。 |
|
|
300
349
|
| `conflict` | fresh 核对已提交目标;真实变化则停止,不换 CAS 强写。 |
|
|
301
|
-
| `forbidden/operation_not_found/invalid` |
|
|
302
|
-
| `unavailable` |
|
|
350
|
+
| `forbidden/operation_not_found/invalid` | 检查角色、身份、原始请求或材料;请求丢失时重新发起,不盲重试。 |
|
|
351
|
+
| `unavailable` | 恢复依赖后查询 NS;未完成时显式重新发起。 |
|
|
303
352
|
|
|
304
|
-
|
|
353
|
+
错误可能来自异常、当次结果或共识结果。结果读取 `code/reason/retryable`;抛出的 `AUNError` 读取 `stringCode/retryable`,其 `code` 是数字 RPC 码。不要绕过 CAS 强写,或因网络错误认定远端未提交;重新发起仍须按当前 NS 事实验收。
|
|
305
354
|
|
|
306
355
|
## 10. 可选托管与旧接口迁移
|
|
307
356
|
|
|
308
357
|
托管和凭据交接由应用独立决定;关系转移不会自动撤销旧 owner 已掌握的私钥、证书或 token。
|
|
309
358
|
|
|
310
|
-
旧 `bindOwner/bindAid/releaseOwnership` 在新 SDK 中返回 `unsupported_protocol`;分别改用 `bindOwneraid/bindSubaid/releaseSubaid`。旧 proof、metadata owner 和旧查询不能证明 2.1
|
|
359
|
+
旧 `bindOwner/bindAid/releaseOwnership` 在新 SDK 中返回 `unsupported_protocol`;分别改用 `bindOwneraid/bindSubaid/releaseSubaid`。旧 proof、metadata owner 和旧查询不能证明 2.1 共识,不能清空旧关系强行迁入。
|
|
360
|
+
|
|
361
|
+
完整的新语义应配套发布 NS 与四 SDK。已有 2.1 NS 的普通绑定、本地绑定及目标 owner 文件先提交的本地转移,正常路径仍可能可用;sub 先同意的转移、Stage 与 owner 文件交错及相同归属重新签发,需要本轮 NS 修复。新 SDK 不调用 decisions,旧服务保留该接口不影响它;过渡版 SDK 若强依赖已移除接口,则需升级。Rust SDK 未随本轮改造,不能套用本文“无任务、无 WAL”的实现结论。
|
|
311
362
|
|
|
312
363
|
Group/Org 名片由实体主签、当前 owner token 上传;失败稿保留完整多签原文、固定 owner/证书代际及原 CAS,应用显式重试,重连不自动 PUT。格式见 [协议 §2.5](../protocol/Ownership协议定义2.1.md#25-grouporg-名片的实体主签与-owner-上传)。
|