@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,211 +1,242 @@
|
|
|
1
1
|
# 凭证与组织服务 SDK 开发与移植指南
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
>
|
|
5
|
-
> 本文面向实现其它语言 SDK、维护现有四端 SDK 或实现兼容 RPC 客户端的开发者。协议契约优先于任一参考实现;不能把 TypeScript、Python、JavaScript 或 Go 单端行为当作其它语言的隐含规范。
|
|
3
|
+
面向 SDK 实现者,按“共同签验 → 请求绑定 → RPC → 持久状态 → 实体恢复”移植。协议为 Org `0.8`,SDK 为 `0.5.19` 基线及当前 `0.5.22` 工作区增量(未发布)。应用调用见 [集成指南](凭证与组织服务SDK应用集成指南.md),字段以 [详细设计](../../../extensions/services/docs/org/0.8/17-凭证与组织服务详细设计.md) 为准,不以任一语言实现代替协议。
|
|
6
4
|
|
|
7
5
|
## 1. 实现层次和边界
|
|
8
6
|
|
|
9
|
-
|
|
7
|
+
| 层次 | 职责/TS 参考 |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| 连接/RPC | 认证、Gateway service-plane、设备/slot、重连、token、外层签名;[rpc-pipeline.ts](../../ts/src/client/rpc-pipeline.ts)。 |
|
|
10
|
+
| 协议 | canonical JSON、CAP、binding、回执、代表证明和完整 Verify;[org-protocol.ts](../../ts/src/org-protocol.ts)。 |
|
|
11
|
+
| Facade | 参数和 method 映射,不复制组织服务状态机;[facades.ts](../../ts/src/facades.ts)。 |
|
|
12
|
+
| 身份编排 | 组织实体身份、名片、rekey、checkpoint/恢复;[client.ts](../../ts/src/client.ts)。 |
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
2. 协议层负责 canonical JSON、凭证/binding/receipt/representation 的结构校验、签名和完整 Verify。
|
|
13
|
-
3. facade 层只做语言化命名、参数合并和 RPC method 映射;不要在 facade 中复制组织状态机。
|
|
14
|
-
4. 高层身份编排层负责组织实体 AID、名片上传、转让 rekey、checkpoint 和恢复。
|
|
15
|
-
|
|
16
|
-
Credential Service 与 Org Service 是独立服务,SDK 与服务之间只通过 AUN JSON-RPC、文件格式和环境约定协作。Credential 是业务服务:`credential.register/revoke/status/revocationList` 等业务 RPC 必须经 Gateway service-plane attach/dispatch,不得经 Kernel 调用;只有健康、状态诊断等控制面方法走 Kernel 控制面。`credential.status` 带凭证 CID 时始终是业务状态查询,走 service-plane。Credential facade 存在不代表 Credential 服务已部署;当前服务端明确保留但尚未实现的入口只有 `org.resource.create`、`org.task.create`、`org.host.add`、`org.workflow.create`,调用时返回业务码 `NOT_IMPLEMENTED`。其它同名资源、任务、主机和工作流方法不在当前 dispatcher 中,调用时按 JSON-RPC `Method not found` 处理。
|
|
14
|
+
Credential/Org 业务经 Gateway service-plane,不经 Kernel;health/诊断走控制面。服务独立部署、独立数据库,不共享私钥或通过代码 import 耦合。
|
|
17
15
|
|
|
18
16
|
## 2. 共同密码学和 JSON 规则
|
|
19
17
|
|
|
20
18
|
### 2.1 两类 canonical JSON
|
|
21
19
|
|
|
22
|
-
|
|
20
|
+
| 输入 | 规范 |
|
|
21
|
+
| --- | --- |
|
|
22
|
+
| CAP/binding/receipt/representation/服务事件 | 键按 Unicode code point 排序,字符串 NFC,数字最短十进制;签名时去掉对象对应签名字段。 |
|
|
23
|
+
| org 外层 client_signature 请求摘要 | 排序和数值规则相同,字符串保持原值,不 NFC。 |
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
两者都拒绝孤立 surrogate、非有限或不安全数值。签名固定 ECDSA P-256/SHA-256,严格标准 Base64 的 ASN.1 DER;不能把 WebCrypto P1363 原样写入。
|
|
25
26
|
|
|
26
|
-
|
|
27
|
+
内部签名片段,unsigned 已按对象规则去除签名字段:
|
|
27
28
|
|
|
28
|
-
```
|
|
29
|
-
{
|
|
29
|
+
```ts
|
|
30
|
+
import { canonicalJson } from './org-protocol.js';
|
|
31
|
+
const result = signer.sign(Buffer.from(canonicalJson(unsigned)));
|
|
32
|
+
if (!result.ok) throw new Error(result.error.message);
|
|
33
|
+
const envelope = { cert_fingerprint: signer.certFingerprint,
|
|
34
|
+
timestamp: now, signature: result.data.signature };
|
|
30
35
|
```
|
|
31
36
|
|
|
32
|
-
|
|
37
|
+
封套仅允许 cert_fingerprint、timestamp、signature 及可选 public_key_fingerprint;拒绝 algorithm/kid/value。resolver 支持 PEM/DER bytes/标准 Base64 DER,核对指纹、证书 AID、P-256 和签名时间。
|
|
33
38
|
|
|
34
39
|
### 2.2 摘要和随机数
|
|
35
40
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
- `credential.register` 与补偿 `credential.revoke` 可以复用业务 request ID,但按 method 独立去重。
|
|
40
|
-
- 不要把时间、nonce、CID 或摘要转成浮点;JavaScript/TypeScript 用 safe integer 检查,Go/Python 解析 JSON 时保留数学整数。
|
|
41
|
+
摘要为 `sha256:<64位小写hex>`;nonce 为安全随机字节的 base64url,默认 32 字节。时间使用 Unix 秒及 `iat ≤ now < exp`,整数限制为 ±9007199254740991。
|
|
42
|
+
|
|
43
|
+
幂等键为 method+request_id,同键换参数摘要报 CREDENTIAL_IDEMPOTENCY_KEY_REUSE/Org IDEMPOTENCY_KEY_REUSE;register 与补偿 revoke 按 method 独立去重。JSON null/字段缺省和语言异步差异不得改变 wire。
|
|
41
44
|
|
|
42
45
|
## 3. AUN-CAP/1 实现契约
|
|
43
46
|
|
|
44
47
|
### 3.1 结构验证
|
|
45
48
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
成员 CAP 的固定关系是:
|
|
49
|
-
|
|
50
|
-
```text
|
|
51
|
-
iss = binding.org_id
|
|
52
|
-
sub = binding.member_aid
|
|
53
|
-
aud 包含 binding.org_id
|
|
54
|
-
cap = org / role.<binding.role> / binding.org_id
|
|
55
|
-
ext.credential_type = member
|
|
56
|
-
ext.membership_id/binding_version/membership_terms_hash 与 binding 相等
|
|
57
|
-
ext.bound_to_membership = true
|
|
58
|
-
delegate = false
|
|
59
|
-
```
|
|
49
|
+
CAP 必填 ver/cid/iat/iss/sub/aud/nbf/exp/cap/key_version/signature。拒绝未知字段、空身份/受众、非法时间、签名结构及超深父链。根深度缺省 0;子凭证显式为父深度+1,最大 8;security_level 为 low/medium/high,缺省 medium,不能降低业务最低策略。
|
|
60
50
|
|
|
61
|
-
|
|
51
|
+
成员 CAP 固定为:iss=org_id、sub=member_aid、aud 包含 org_id,唯一能力为 org/role.<role>/org_id;ext 绑定 membership_id、binding_version、terms_hash,bound_to_membership=true、delegate=false,不允许 parent delegation。createMemberCredential 必须拒绝冲突覆盖。
|
|
62
52
|
|
|
63
53
|
### 3.2 验证级别
|
|
64
54
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
55
|
+
```mermaid
|
|
56
|
+
flowchart LR
|
|
57
|
+
A[结构、链、各层签名、时间和收窄] --> B[当前 CAP 及父链状态]
|
|
58
|
+
B --> C[实际能力和约束]
|
|
59
|
+
C --> D[实际请求 binding]
|
|
60
|
+
D --> E[成员双签和当前状态]
|
|
61
|
+
E --> F[代表证明、Ownership 和 actor 状态]
|
|
62
|
+
F --> G[重读时钟,复核全部有效窗口]
|
|
63
|
+
G -->|全部通过| H[授权结果]
|
|
64
|
+
```
|
|
69
65
|
|
|
70
|
-
|
|
66
|
+
```ts
|
|
67
|
+
import { verifyCredential } from './org-protocol.js';
|
|
68
|
+
const checked = verifyCredential(credential, verificationContext);
|
|
69
|
+
```
|
|
71
70
|
|
|
72
|
-
|
|
73
|
-
2. 对每个父文档调用强 `resolveStatusProof`。受信 resolver 必须先验证 Credential 服务的签名、证书信任链和当前撤销状态,并确认 proof 中的查询 `request_id/nonce/target` 与实际请求及服务身份绑定;不能仅凭 proof 自报 `verified:true` 建立信任。SDK 再核对 `aun-credential-status/1`、CID、完整 CAP hash、active、asOf/proofExpiresAt、responder、request_id、nonce、target 和签名时间等字段。父 proof 缺失或畸形返回 `CREDENTIAL_STATUS_UNKNOWN`,CID/hash 明确不等返回 `CREDENTIAL_CHAIN_INVALID`。SDK 检查 proof 字段不等于自行建立 Credential 服务证书信任。
|
|
74
|
-
3. 检查当前 CAP 的 `ns/action/resource/constraints`,包括 path、IP、regex、时间窗口、数值、allowed/denied 和 rate limit。
|
|
75
|
-
4. 检查 `request_binding`:method、服务 target、params_hash、CID、request ID、nonce 和时间窗必须对应真实请求;通用及 admission binding 统一满足 `iat ≤ now < exp ≤ iat+300`。
|
|
76
|
-
5. 成员 CAP 必须有完整当前 binding、双签和 `resolveMembershipStatus=true`;仅凭历史 binding 或 CAP active 不得放行。
|
|
77
|
-
6. 代表调用必须验 representation proof,并通过受信 Ownership/actor 状态确认 actor 有权代表 target;actor 状态未知、封禁或 resolver 缺失拒绝。
|
|
71
|
+
verifySignature 只做结构/证书/数学验签,可选时间和受众,不授权。verify 的 context 必须绑定实际 audience、subject、能力和 method/target/params/requestId/nonce/requestBinding。
|
|
78
72
|
|
|
79
|
-
|
|
73
|
+
有 parent 时,每个父文档必须取得强 resolveStatusProof;受信 resolver 先验服务签名、信任链/撤销及真实查询 request ID/nonce/target,SDK 再核对 aun-credential-status/1、CID/完整 CAP hash、active、responder 和证明窗口。缺失/畸形为 STATUS_UNKNOWN,明确 CID/hash 不符为 CHAIN_INVALID;不得降为字符串 active 或相信自报 verified。
|
|
80
74
|
|
|
81
|
-
|
|
75
|
+
成员必须有当前 binding 双签及 resolveMembershipStatus=true;代表请求另验当前 Ownership 和 actor 状态。未指定 now 时,所有 resolver/异步等待后重读时钟,复核 CAP、证书、状态 proof、request binding 和代表证明;显式有效 now 按固定时间测试。校验不修改输入。
|
|
82
76
|
|
|
83
77
|
## 4. Membership binding、回执与请求绑定
|
|
84
78
|
|
|
85
79
|
### 4.1 Binding
|
|
86
80
|
|
|
87
|
-
|
|
81
|
+
成员和组织签同一不可变条款,签名 payload 去掉 member_signature/org_signature;绑定 membership_id、binding_version、terms_hash、request ID/nonce 和时间窗。binding 不是能力凭证,当前成员状态由 Org 保存。
|
|
88
82
|
|
|
89
|
-
|
|
83
|
+
```ts
|
|
84
|
+
import { createMembershipBinding, signMembershipBinding } from './org-protocol.js';
|
|
85
|
+
const memberSigned = createMembershipBinding(bindingOptions, memberSigner);
|
|
86
|
+
const bothSigned = signMembershipBinding(memberSigned, orgSigner, 'org');
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
申请先成员签,邀请先组织签;每个邀请目标独立 binding/nonce/CAP/登记授权,不能互换材料。
|
|
90
90
|
|
|
91
91
|
### 4.2 登记授权和回执
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
```mermaid
|
|
94
|
+
sequenceDiagram
|
|
95
|
+
participant I as issuer/Org SDK
|
|
96
|
+
participant O as Org 服务
|
|
97
|
+
participant C as Credential 服务
|
|
98
|
+
I->>O: 完整双签 binding、CAP 和登记授权
|
|
99
|
+
O->>C: register:原 CID、request ID、nonce 和请求绑定
|
|
100
|
+
C-->>O: 服务签名 registrationReceipt
|
|
101
|
+
O->>O: 核对服务、registrar=iss、CID/全文摘要、原请求和有效期
|
|
102
|
+
O->>O: 最终化成员及版本
|
|
103
|
+
O-->>I: 完整成员包
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
registration_authorization 由 issuer 签,覆盖完整 CAP hash、CID、原 request ID/nonce、Credential target、relay 和期限;转交服务不是 registrar。回执只是登记见证,不代替授权;公开验回执和服务最终化均按当前窗口严格检查。
|
|
94
107
|
|
|
95
|
-
|
|
108
|
+
受限跨期恢复只接受原期限内已持久且已发送的同一已批准操作,固定 CID/request ID/nonce、双签、登记授权和成员 CAS。原回执仅作私有历史来源,仍须新鲜签名状态绑定同一 CAP/全文摘要,并确认当前成员版本已生效;只记录既成结果,不重登记/重签。无原回执的 generic 恢复还须 registrationConfirmedAt,仅保存 issuer checkpoint,不导入 holder/发送 issued;holder 交付仍需有效原回执。unknown、revoked、未提交或不匹配拒绝,详见 [审查 §7.14](../../../extensions/services/docs/org/0.8/凭证与组织服务及四SDK审查报告.md)。
|
|
96
109
|
|
|
97
110
|
### 4.3 Org request binding
|
|
98
111
|
|
|
99
|
-
|
|
112
|
+
```mermaid
|
|
113
|
+
flowchart LR
|
|
114
|
+
A[业务参数+AAD+授权包] --> B[去 request_binding、client_signature、下划线字段、representation_proof]
|
|
115
|
+
B --> C[业务摘要:request binding/代表证明]
|
|
116
|
+
C --> D[完整准备后的参数]
|
|
117
|
+
D --> E[仅去 client_signature 和下划线字段,重算外层摘要]
|
|
118
|
+
E --> F[RPC 管线生成 client_signature]
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
```ts
|
|
122
|
+
const prepared = client.org.prepareRequest(
|
|
123
|
+
'org.member.get', params, orgServiceAid, signer,
|
|
124
|
+
);
|
|
125
|
+
const result = await client.org.member.get(prepared);
|
|
126
|
+
```
|
|
100
127
|
|
|
101
|
-
|
|
102
|
-
- 计算 `request_binding.params_hash` 和 representation proof 所需的业务参数摘要时去除 `request_binding`、`client_signature`、所有 `_` 前缀字段和 `credentials.representation_proof`;保留其它 credentials 与 AAD;
|
|
103
|
-
- `request_binding.params_hash` 与 representation proof 使用上述同一业务参数摘要;外层 `client_signature.params_hash` 在发送前对完整准备后的组织参数重新计算,保留 AAD、request binding 和授权包,只去除 `client_signature` 与 `_` 前缀字段,不得复用 `request_binding.params_hash`;
|
|
104
|
-
- 首次 `org.member.join` 和 `org.member.inviteAccept` 一律使用 `membership_id` 专用 admission request binding,不伪造 `credential_cid`;本人和代表调用都必须提交目标成员的 `member_signature`,本人不要求已有 active 成员 CAP;仅代表另一个目标(`for != signer.aid`)时需要 admission representation proof 和当前 ownership/status 校验。本人直接 `inviteAccept` 复用邀请保存的组织签名、CAP 模板和登记授权,SDK 不重签或重造这些材料;
|
|
105
|
-
- 对已有签名、binding、nonce 或外层重复签名做一致性比较,冲突直接报错。
|
|
128
|
+
两层 params_hash 不可复用。所有 org.* 加 aad.org_id,不匹配即拒绝;只有 lifecycle.list/health/status 允许 null。外层签名覆盖完整 method、AID、timestamp 和外层摘要,服务端独立重算。
|
|
106
129
|
|
|
107
|
-
|
|
130
|
+
首次 join/inviteAccept 使用 membership_id 专用 admission binding,复用原 request ID/nonce,不含 credential_cid,不要求已有 active CAP。本人/代表都须目标成员签名;仅 for≠signer.aid 加 admission representation proof 和当前 Ownership/actor 检查。inviteAccept 保留原组织签名、CAP 模板及登记授权;已有绑定/签名冲突不能重写。
|
|
108
131
|
|
|
109
132
|
### 4.4 Credential request binding
|
|
110
133
|
|
|
111
|
-
|
|
134
|
+
register/revoke/status/revocationList 均绑定真实 method、target、参数摘要、request ID/nonce、iat/exp 和 CID,满足 exp≤iat+300。仅 revocationList 的 CID 固定为空,摘要仍包含 issuer、cursor、limit、since_event_seq。
|
|
135
|
+
|
|
136
|
+
内部 helper 示例;public Credential facade 不自动生成该绑定,也没有 credential.prepare:
|
|
137
|
+
|
|
138
|
+
```ts
|
|
139
|
+
import { buildRequestBinding } from './org-protocol.js';
|
|
140
|
+
const requestBinding = buildRequestBinding(
|
|
141
|
+
method, credentialServiceAid, businessParams, cid, nonce, requestId, now, now + 300,
|
|
142
|
+
);
|
|
143
|
+
```
|
|
112
144
|
|
|
113
145
|
## 5. Facade 和 RPC 映射
|
|
114
146
|
|
|
115
147
|
### 5.1 四端公共能力
|
|
116
148
|
|
|
117
|
-
| 能力 | Python |
|
|
118
|
-
|
|
119
|
-
|
|
|
120
|
-
|
|
|
121
|
-
|
|
|
122
|
-
| 协议层请求准备 helper | `prepare_org_request` | `prepareOrganizationRequest` | `prepareOrganizationRequest` | `PrepareOrganizationRequest` |
|
|
123
|
-
| 完整验证 | `verify_credential` | `verifyCredential` | `verifyCredential` | `VerifyCredential` |
|
|
124
|
-
| 状态 proof | `resolve_status_proof` | `resolveStatusProof` | 可返回 Promise | `ResolveStatusProof` |
|
|
149
|
+
| 能力 | Python | TS/JS | Go |
|
|
150
|
+
| --- | --- | --- | --- |
|
|
151
|
+
| facade | client.credential/org | client.credential/org | Credential()/Org() |
|
|
152
|
+
| 请求准备 | org.prepare_request | org.prepareRequest | Org().PrepareRequest |
|
|
153
|
+
| 完整验证 helper | verify_credential | verifyCredential | VerifyCredential |
|
|
125
154
|
|
|
126
|
-
|
|
155
|
+
协议 helper 和 facade 命名分开;创建高层入口分别为 org.lifecycle.create、client.createOrg、client.CreateOrg,不能将概念名当四端统一方法名。
|
|
127
156
|
|
|
128
157
|
### 5.2 当前方法集合
|
|
129
158
|
|
|
130
|
-
Credential
|
|
131
|
-
|
|
132
|
-
Org facade 映射:
|
|
133
|
-
|
|
134
|
-
- lifecycle:`create/get/list/update/suspend/resume/dissolve/transfer/transferAccept`;
|
|
135
|
-
- member:`list/get/join/approveJoin/renewCredential/rejectJoin/add/invite/inviteAccept/inviteReject/leave/kick/offboard/freeze/unfreeze/ban/unban`;
|
|
136
|
-
- credential:`getStatus/revocationList`;
|
|
137
|
-
- audit:`query`;authz:`check`;health/status。
|
|
159
|
+
Credential:register/revoke/status(getStatus 别名)/revocationList;本地 create/verifySignature/verify/verifyRegistrationReceipt/current。Org:lifecycle、member、credential、audit.query、authz.check;具体方法见 [RPC 手册](09-组织服务RPC手册.md)。
|
|
138
160
|
|
|
139
|
-
|
|
161
|
+
保留的 resource.create/task.create/host.add/workflow.create 返回 NOT_IMPLEMENTED,其他未注册同类方法返回 Method not found。membership.reserve/get/commit/release 为内部受限接口,member.add 仅服务内部最终化使用。
|
|
140
162
|
|
|
141
163
|
### 5.3 异步约定
|
|
142
164
|
|
|
143
|
-
Python RPC
|
|
144
|
-
|
|
145
|
-
## 6. 高层实体身份和转让编排
|
|
165
|
+
Python RPC async、本地协议 helper 同步;Node TS 协议 helper 同步,浏览器 WebCrypto helper 返回 Promise,Go 返回 value/error。公共文件 AIDStore.sign/verify 的 TS/JS 接口均为 Promise<Result>;这些差异不能进入 wire。
|
|
146
166
|
|
|
147
|
-
|
|
167
|
+
### 5.4 撤销同步与持久快照(0.5.22)
|
|
148
168
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
169
|
+
```mermaid
|
|
170
|
+
flowchart LR
|
|
171
|
+
A[推送/列表页] --> B[验证服务、目标、签名和时间窗]
|
|
172
|
+
B --> C[复核身份、连接和 worker 代次]
|
|
173
|
+
C --> D[读取当前 authority 快照,逐 CID 合并最大 event_seq]
|
|
174
|
+
D --> E[仅连续覆盖的列表页可推进分页位置]
|
|
175
|
+
E --> F[持久保存,再影响授权/通知应用]
|
|
176
|
+
```
|
|
155
177
|
|
|
156
|
-
|
|
178
|
+
```ts
|
|
179
|
+
import { verifyServiceEvent } from './org-protocol.js';
|
|
180
|
+
const verifiedEvent = await verifyServiceEvent(eventName, payload, eventContext);
|
|
181
|
+
```
|
|
157
182
|
|
|
158
|
-
|
|
183
|
+
四端使用既有 keystore/tokenstore 的 credential_revocations_v1 metadata(浏览器 IndexedDB),保存 version=1、authority 分区 revoked、since_event_seq、cursor、as_of、expires_at。单条推送不推进水位,旧页不覆盖新证据;本地未见 CID 不证明有效,完整 Verify 仍需新鲜状态 proof。
|
|
159
184
|
|
|
160
|
-
|
|
185
|
+
兜底列表:连接后一小时首次,此后每小时,重连重新计时。长期凭证扫描:READY 后及在线每 60 秒;断线/关闭/身份变化取消旧代任务。续期成功立即保存完整 CAP、binding、terms、回执、服务版本和信息,供 credential.current 读取;只写当前成员账户,短期凭证保持 long_term=false。自动续期标识 aun-credential-renewal/1 不是跨版本冻结契约。
|
|
161
186
|
|
|
162
|
-
|
|
163
|
-
- `credential.revoke` 按 `(request_id, method)` 去重,支持父链级联和失败补偿封闭 CID;
|
|
164
|
-
- `credential.status` 返回签名 status proof;`revocationList` 返回签名增量;
|
|
165
|
-
- 服务身份或数据库不可用时返回状态未知,不签发临时服务签名。
|
|
187
|
+
## 6. 高层实体身份和转让编排
|
|
166
188
|
|
|
167
|
-
|
|
189
|
+
```mermaid
|
|
190
|
+
flowchart LR
|
|
191
|
+
A[校验 proposal、owner 和双方完整成员材料] --> B[生成新 P-256 私钥并持久保存 checkpoint]
|
|
192
|
+
B --> C[持久保存 rekey 参数后调用]
|
|
193
|
+
C --> D[导入匹配新公钥/指纹的证书]
|
|
194
|
+
D --> E[新实体签双方 binding/CAP,保存独立 finalize 请求]
|
|
195
|
+
E --> F[finalize:提交新成员包并撤旧 CAP]
|
|
196
|
+
F --> G[新实体主签、owner token 上传名片]
|
|
197
|
+
G --> H[保存 completed 结果,后续可精确重放]
|
|
198
|
+
```
|
|
168
199
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
200
|
+
```ts
|
|
201
|
+
const result = await client.completeOrgTransfer(
|
|
202
|
+
originalTransferParams, { aidStore },
|
|
203
|
+
);
|
|
204
|
+
```
|
|
173
205
|
|
|
174
|
-
|
|
206
|
+
checkpoint 固定输入摘要、transfer ID、owner、proposal、原新私钥、公钥、阶段 request ID/nonce/params。恢复不复制旧组织私钥、不生成替代 key;输入或公钥变化报 conflict,缺原候选私钥报 persistence_unavailable。rekey/finalize 使用不同持久 request ID。
|
|
175
207
|
|
|
176
|
-
|
|
208
|
+
0.5.22:Python 缺 key 保留 checkpoint 并拒绝;Go 导入前核对证书与 CA 结果指纹;TS/JS 保留 completed,精确同任务返回原结果,重连跳过完成态。不补造缺失的历史恢复材料。
|
|
177
209
|
|
|
178
|
-
|
|
210
|
+
组织名片实体主签、owner token 上传,可选当前 owner 附签且全验;现代指纹严格匹配,Org 不开放旧实体上传。完整多签原文、原 CAS、固定 owner/证书代际留待显式重试,重连不自动 PUT;转让/rekey/解散停止旧代待办。通用文件签验见 [Ownership 移植 §4](Ownership2.1-SDK开发与移植指南.md#4-原始文件严格解析与签名),不改变 CAP/binding 算法。
|
|
179
211
|
|
|
180
|
-
|
|
212
|
+
解散先以当前 binding/CAP 准备请求,服务确认 dissolved 后才标记实体证书失效,清创建/转让及名片待办和设备/slot 恢复状态;保留磁盘私钥,不追溯失效已加载 signer,后续 AIDStore.load 拒绝该证书。
|
|
181
213
|
|
|
182
|
-
|
|
214
|
+
## 7. 服务端兼容实现要点
|
|
183
215
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
216
|
+
| 服务 | 必须保持 |
|
|
217
|
+
| --- | --- |
|
|
218
|
+
| Credential | register 只收完整 CAP 并签回执;status/列表返回签名证明;revoke 从持久去重恢复原请求摘要、CID 和 revoked,冲突或损坏不当成功。 |
|
|
219
|
+
| Org 授权 | 独立验 client signature/AAD;受保护读写验 CAP、binding、request binding 和当前 actor/member。公开 lifecycle 读取按可见性处理。 |
|
|
220
|
+
| 跨服务收尾 | 外部登记/吊销不在 Org SQL 事务内,失败保留续跑;创建补偿遇幂等冲突停止自动补偿,槽位提交丢响应先复读原操作。 |
|
|
221
|
+
| 转让/通知 | 新换钥前核对代际,以规范 SPKI DER Base64 调 CA;成员替换及新旧 owner 完整包通知同次持久保存,失败按组织轮转重试。 |
|
|
222
|
+
| 事件/跨域 | 先验签,再按 responder/event_id/current_aid 去重(最近4096项,不承诺重启 exactly-once);实体跨域重试用上传者域 token,向实体域提交原文件/CAS。 |
|
|
189
223
|
|
|
190
|
-
|
|
224
|
+
以上需要配套服务部署;不能从 SDK 版本推断服务已具备。
|
|
191
225
|
|
|
192
|
-
|
|
226
|
+
## 8. 错误模型与兼容性
|
|
193
227
|
|
|
194
|
-
|
|
195
|
-
2. 再覆盖四类本地 helper:create、signature verify、full Verify、prepare request。
|
|
196
|
-
3. 再覆盖 Credential register/status/revoke/revocationList 的 RPC transcript 和幂等/补偿。
|
|
197
|
-
4. 再覆盖 Org create/join/approve/invite/inviteAccept/renew/offboard/transfer 两阶段和服务事件验签。
|
|
198
|
-
5. 最后做单域、跨语言、跨域和故障恢复;真实 MySQL、多实例部署、Linux/macOS 仍需按服务 TDD 计划单独验收。
|
|
228
|
+
保留结构化业务码及 retryable;不要解析错误文本。签名/链/摘要/binding/权限/成员状态/幂等键冲突不盲重试,服务/数据库/证书状态未知可等待但不授权。
|
|
199
229
|
|
|
200
|
-
|
|
230
|
+
跨平台必须固定 Unicode/JSON 数值、PEM/DER/Base64 边界、UTC Unix 时间和 exp 开区间;不把 None/undefined/nil 混成相同字段,也不将 Promise/exception/error 写入 wire。
|
|
201
231
|
|
|
202
|
-
|
|
232
|
+
## 9. 测试与验收
|
|
203
233
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
234
|
+
| 顺序 | 验收范围 |
|
|
235
|
+
| --- | --- |
|
|
236
|
+
| 共同向量 | [org-0.8/protocol.json](../../tests/vectors/org-0.8/protocol.json):canonical bytes、DER、CID/hash、binding、receipt、representation 和错误码。 |
|
|
237
|
+
| 本地 helper | 创建、签名预检、完整 Verify、请求准备;父链缺证明、错误 CID/版本、过期、代表目标及两层摘要冲突必须拒绝。 |
|
|
238
|
+
| Credential RPC | register/status/revoke/列表,持久幂等、失败补偿、撤销推送/分页乱序、重启快照。 |
|
|
239
|
+
| Org/恢复 | join/approve/invite/renew/offboard,rekey/finalize 断线、缺 key、完成重放、完整成员包、解散失效。 |
|
|
240
|
+
| 网络 | 单域 → cross-SDK → 双域;真实数据库、多实例、浏览器和跨平台分别验收,失败即停并从检查点续跑。 |
|
|
210
241
|
|
|
211
|
-
|
|
242
|
+
四端参考:TS/JS 的 src/org-protocol.ts、src/facades.ts;Python 的 aun_core/org_protocol.py、org_facades.py;Go 的 org_protocol.go、org_facades.go。版本专项与真实验收边界见 [四端对齐清单](../../python/CHANGES_FOR_PARITY.md)。
|
package/dist/agent-md.d.ts
CHANGED
|
@@ -20,6 +20,11 @@ export type AgentMdVerification = {
|
|
|
20
20
|
reason?: string;
|
|
21
21
|
ownership_status?: OwnershipVerificationStatus | 'not_applicable';
|
|
22
22
|
};
|
|
23
|
+
type AgentMdObservation = {
|
|
24
|
+
root: string;
|
|
25
|
+
etag: string;
|
|
26
|
+
version: number;
|
|
27
|
+
};
|
|
23
28
|
export interface AgentMdFrontmatter {
|
|
24
29
|
aid?: string;
|
|
25
30
|
name?: string;
|
|
@@ -114,7 +119,13 @@ export declare class AgentMdManager {
|
|
|
114
119
|
private _loadRecord;
|
|
115
120
|
loadRecord(aid: string): Record<string, unknown> | null;
|
|
116
121
|
private _saveRecord;
|
|
117
|
-
saveRecord(aid: string, fields: Record<string, unknown
|
|
122
|
+
saveRecord(aid: string, fields: Record<string, unknown>, observation?: AgentMdObservation): Record<string, unknown>;
|
|
123
|
+
cacheOwnershipSnapshot(aid: string, snapshot: unknown, observation: {
|
|
124
|
+
root: string;
|
|
125
|
+
etag: string;
|
|
126
|
+
version: number;
|
|
127
|
+
content_hash: string;
|
|
128
|
+
}): boolean;
|
|
118
129
|
private _clearConfirmedDraft;
|
|
119
130
|
upload(content?: string | null, originalCondition?: OwnershipSavedFile['condition']): Promise<Record<string, unknown>>;
|
|
120
131
|
readAgentMdFresh(aid: string): Promise<{
|
|
@@ -123,7 +134,9 @@ export declare class AgentMdManager {
|
|
|
123
134
|
etag: string;
|
|
124
135
|
}>;
|
|
125
136
|
readOwnershipFresh(aid: string): Promise<OwnershipAgentObservation>;
|
|
126
|
-
|
|
137
|
+
_readOwnershipQuery(aid: string): Promise<OwnershipAgentObservation>;
|
|
138
|
+
private _readOwnership;
|
|
139
|
+
submitOwnershipRaw(aid: string, raw: string, condition: OwnershipSavedFile['condition'], assertActive?: () => void, stage?: boolean): Promise<OwnershipAgentObservation>;
|
|
127
140
|
private _ownershipRequest;
|
|
128
141
|
uploadAs(targetAid: string, content: string, signer: AID): Promise<Record<string, unknown>>;
|
|
129
142
|
private _pendingUpload;
|
|
@@ -181,3 +194,4 @@ export declare class AgentMdManager {
|
|
|
181
194
|
private _writeRecordUnlocked;
|
|
182
195
|
private _readRecordUnlocked;
|
|
183
196
|
}
|
|
197
|
+
export {};
|