@agentunion/fastaun 0.5.25 → 0.5.27
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 +41 -0
- package/_packed_docs/CHANGELOG.md +41 -0
- package/_packed_docs/INDEX.md +22 -14
- package/_packed_docs/KITE_DOCS_GUIDE.md +11 -6
- 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 +16 -1
- package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +37 -9
- package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +20 -9
- package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +57 -12
- package/_packed_docs/cli//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241CLI/345/274/200/345/217/221/344/270/216/344/275/277/347/224/250/346/214/207/345/215/227.md +869 -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 +2 -2
- package/_packed_docs/sdk/0.5.27-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +408 -0
- package/_packed_docs/sdk/0.5.27-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +410 -0
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +2 -2
- package/_packed_docs/sdk/09-/345/207/255/350/257/201/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +187 -73
- package/_packed_docs/sdk/09-/347/273/204/347/273/207/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +1 -1
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +13 -9
- package/_packed_docs/sdk/INDEX.md +21 -13
- package/_packed_docs/sdk/agent.md/344/270/216group.index/347/232/204ETag/350/247/202/345/257/237/344/270/216/345/220/214/346/255/245/346/234/272/345/210/266.md +240 -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 +973 -266
- 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 +950 -242
- package/dist/agent-md-schema.js +1 -1
- package/dist/agent-md-schema.js.map +1 -1
- package/dist/agent-md.js +5 -0
- package/dist/agent-md.js.map +1 -1
- package/dist/aid.js +3 -3
- package/dist/aid.js.map +1 -1
- package/dist/auth.js +21 -19
- package/dist/auth.js.map +1 -1
- package/dist/cert-utils.d.ts +1 -1
- package/dist/cert-utils.js +4 -4
- package/dist/cert-utils.js.map +1 -1
- package/dist/client/lifecycle.d.ts +1 -1
- package/dist/client/lifecycle.js.map +1 -1
- package/dist/client/rpc-pipeline.js +8 -1
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.js +7 -0
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +12 -0
- package/dist/client.js +305 -29
- package/dist/client.js.map +1 -1
- package/dist/facades.d.ts +38 -0
- package/dist/facades.js +49 -5
- package/dist/facades.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/keystore/local-identity-store.js +16 -1
- package/dist/keystore/local-identity-store.js.map +1 -1
- package/dist/keystore/local-token-store.js +16 -1
- package/dist/keystore/local-token-store.js.map +1 -1
- package/dist/org-protocol.d.ts +1 -0
- package/dist/org-protocol.js +39 -36
- package/dist/org-protocol.js.map +1 -1
- package/dist/ownership-v21.js +7 -7
- package/dist/ownership-v21.js.map +1 -1
- package/dist/register-flow.js +2 -2
- package/dist/register-flow.js.map +1 -1
- package/dist/semantic-facade.d.ts +176 -0
- package/dist/semantic-facade.js +611 -0
- package/dist/semantic-facade.js.map +1 -0
- package/dist/semantic-protocol.d.ts +810 -0
- package/dist/semantic-protocol.js +894 -0
- package/dist/semantic-protocol.js.map +1 -0
- package/dist/tools/cross-sdk-agent.d.ts +11 -1
- package/dist/tools/cross-sdk-agent.js +388 -7
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.d.ts +1 -0
- package/dist/transport.js +28 -2
- package/dist/transport.js.map +1 -1
- package/dist/v2/e2ee/decrypt.d.ts +5 -0
- package/dist/v2/e2ee/decrypt.js +22 -2
- package/dist/v2/e2ee/decrypt.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -1
- package/src/certs/root.crt +13 -0
|
@@ -91,7 +91,7 @@ NS 的 `ownership_pending` 与名片 CAS 一起持久化;pending 名片是当
|
|
|
91
91
|
- 按 authority/CID 保留最大 `event_seq`,推送与分页并发合并,不覆盖新记录。
|
|
92
92
|
- 异步验证/持久化前后核对身份和连接代次,丢弃旧结果;用于完整凭证和父证明链验证。
|
|
93
93
|
|
|
94
|
-
四端使用 tokenstore/keystore 的 `credential_revocations_v1` metadata(浏览器 IndexedDB),按 authority 保存 CID 序号、分页 checkpoint 和证明时间窗。它不是 JSONL 流水,缺少 CID 不证明有效;结构见 [撤销快照](凭证与组织服务SDK开发与移植指南.md#
|
|
94
|
+
四端使用 tokenstore/keystore 的 `credential_revocations_v1` metadata(浏览器 IndexedDB),按 authority 保存 CID 序号、分页 checkpoint 和证明时间窗。它不是 JSONL 流水,缺少 CID 不证明有效;结构见 [撤销快照](凭证与组织服务SDK开发与移植指南.md#64-撤销同步与持久快照0522)。
|
|
95
95
|
|
|
96
96
|
### 5.2 保持分页连续
|
|
97
97
|
|
|
@@ -114,7 +114,7 @@ NS 的 `ownership_pending` 与名片 CAS 一起持久化;pending 名片是当
|
|
|
114
114
|
- 转让换钥前复核证书/公钥代际,新公钥用规范 DER Base64;已有 checkpoint 恢复原请求。
|
|
115
115
|
- 原子保存新旧 owner 成员包与定向 `org.member.changed` 通知;失败通知保留待办并按组织轮转。SDK 仍验完整包,续期保存不依赖通知。
|
|
116
116
|
|
|
117
|
-
详见 [Credential RPC](09-凭证服务RPC手册.md#credentialrevoke)、[Org RPC](09-组织服务RPC手册.md#组织生命周期)及 [服务实现要求](凭证与组织服务SDK开发与移植指南.md#
|
|
117
|
+
详见 [Credential RPC](09-凭证服务RPC手册.md#credentialrevoke)、[Org RPC](09-组织服务RPC手册.md#组织生命周期)及 [服务实现要求](凭证与组织服务SDK开发与移植指南.md#8-服务端兼容实现要点)。
|
|
118
118
|
|
|
119
119
|
## 6. 默认读缓存、语言专项修复与版本
|
|
120
120
|
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
# AUN SDK 0.5.27 应用集成指南
|
|
2
|
+
|
|
3
|
+
面向应用开发者,按截至 2026-10-29 的 `0.5.27` 未发布工作区整理。Node.js 示例使用 `@agentunion/fastaun`,浏览器使用 `@agentunion/fastaun-browser`。实现契约见 [开发与移植指南](0.5.27-SDK开发与移植指南.md)。
|
|
4
|
+
|
|
5
|
+
## 1. 版本范围与接入路径
|
|
6
|
+
|
|
7
|
+
四端统一对照 `0.5.25`(`133067c80`)。`0.5.26` 仅为 TS npm 包补入 `src/certs/root.crt`;其余本轮运行时代码增量归入 `0.5.27`。详细依据见 [CHANGELOG 与 parity](../../python/CHANGES_FOR_PARITY.md#v0527--相对于-v0525-基线的变更未发布)。
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
flowchart LR
|
|
11
|
+
A[加载身份与信任根] --> B[订阅消息并连接]
|
|
12
|
+
B --> C[普通消息与业务数据库]
|
|
13
|
+
B --> D[结构化 CAP]
|
|
14
|
+
D --> E[语义或混合 CAP]
|
|
15
|
+
E --> F[组织成员与代表调用]
|
|
16
|
+
E --> G[模型复核与额度账本]
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
| 范围 | 本轮应用侧接线 |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| 连接 | Gateway 迁移由 SDK 编排;应用保留业务幂等键与结果未知状态 |
|
|
22
|
+
| 普通 CAP | 完整 Verify、当前状态证明、撤销恢复与 CLI 接入 |
|
|
23
|
+
| 语义/混合 CAP | 原件、确认元数据、来源链、请求、证据、业务复核和 Usage |
|
|
24
|
+
| 当前态 | ±300 秒时钟容错;online 查询耗时、bounded 消费 TTL 独立计算 |
|
|
25
|
+
| 组织 | 创建/转让使用本次确认结果与实体证书续办名片 |
|
|
26
|
+
| 本地存储 | 固定身份命名空间、设备与 slot,恢复 SDK checkpoint 和应用账本 |
|
|
27
|
+
|
|
28
|
+
以下 Node TS 片段按章节顺序共享身份、连接与类型上下文;`declare` 声明的是应用需要实现的端口。§2.3 浏览器片段独立使用。示例中的 `reports.agentid.cn` 是应用业务服务 AID,服务地址采用 `{svc}.{issuer}`。
|
|
29
|
+
|
|
30
|
+
## 2. 身份、信任根与连接
|
|
31
|
+
|
|
32
|
+
### 2.1 Node.js 加载已有身份
|
|
33
|
+
|
|
34
|
+
Node.js 要求 `>=22.16.0`。先安装目标版本并核对实际产物;持久保存 `aunPath` 与解密 seed。
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
import { randomBytes, randomUUID } from 'node:crypto';
|
|
38
|
+
import { AIDStore, AUNClient, semanticProtocol as sp,
|
|
39
|
+
type JsonObject, type CredentialVerificationContext,
|
|
40
|
+
type SemanticPackageVerificationContext,
|
|
41
|
+
type SemanticRecordVerificationContext } from '@agentunion/fastaun';
|
|
42
|
+
const businessAid = 'reports.agentid.cn';
|
|
43
|
+
const credentialServiceAid = 'credential.agentid.cn';
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
const store = new AIDStore({ aunPath: process.env.AUN_PATH!,
|
|
48
|
+
encryptionSeed: process.env.AUN_SEED ?? '', slotId: 'main', verifySsl: true });
|
|
49
|
+
const loaded = store.load('helper.agentid.cn');
|
|
50
|
+
if (!loaded.ok) throw new Error(loaded.error.message);
|
|
51
|
+
const signer = loaded.data.aid;
|
|
52
|
+
if (!signer.isPrivateKeyValid()) throw new Error('本身份私钥不可用');
|
|
53
|
+
const client = new AUNClient(signer);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
TS 的文件 store 缺少根文件时排他补入内置根,已有本地根配置保留。应用提供的根及证书链仍按自己的信任策略管理,见 [连接与认证](04-连接与认证.md)。首次创建身份使用 `store.register()`;重启直接加载已有身份。
|
|
57
|
+
|
|
58
|
+
### 2.2 先接收,再连接
|
|
59
|
+
|
|
60
|
+
`commitDeliveryBatch` 在应用数据库中原子保存消息、撤回记录及业务幂等键,提交后完成 Promise。
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
declare function commitDeliveryBatch(batch: unknown): Promise<void>;
|
|
64
|
+
client.on('message.batch', batch => commitDeliveryBatch(batch));
|
|
65
|
+
client.on('group.message_batch', batch => commitDeliveryBatch(batch));
|
|
66
|
+
client.on('group.event_batch', batch => commitDeliveryBatch(batch));
|
|
67
|
+
client.on('state_change', () => console.log(client.state));
|
|
68
|
+
await client.connect({ auto_reconnect: true });
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```mermaid
|
|
72
|
+
flowchart LR
|
|
73
|
+
A[认证完成] --> B[连接可用]
|
|
74
|
+
B --> C[消息追赶与凭证恢复并行进行]
|
|
75
|
+
C --> D[应用按各业务完成状态展示]
|
|
76
|
+
B --> E[立即 fresh 同步普通凭证权威与 CRL]
|
|
77
|
+
E --> F[之后按小时补拉]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
普通长连接在上线/重连后立即扫描已管理记录及持久快照中的权威;short 连接跳过后台扫描。连接成功、消息同步完成、凭证业务完成分别展示。
|
|
81
|
+
|
|
82
|
+
### 2.3 浏览器独立入口
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
import { AIDStore as BrowserStore, AUNClient as BrowserClient } from '@agentunion/fastaun-browser';
|
|
86
|
+
const browserStore = new BrowserStore({ aunPath: 'myapp', encryptionSeed: '', slotId: 'main' });
|
|
87
|
+
const browserLoaded = await browserStore.load('helper.agentid.cn');
|
|
88
|
+
if (!browserLoaded.ok) throw new Error(browserLoaded.error.message);
|
|
89
|
+
const browserClient = new BrowserClient(browserLoaded.data.aid);
|
|
90
|
+
declare function persistBrowserBatch(batch: unknown): Promise<void>;
|
|
91
|
+
browserClient.on('message.batch', batch => persistBrowserBatch(batch));
|
|
92
|
+
await browserClient.connect({ auto_reconnect: true });
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
浏览器的身份、token 与 checkpoint 落在 IndexedDB,密码运算使用 WebCrypto;HTTPS 信任由浏览器管理。应用接入消息时,沿用 §2.2 的先订阅后连接顺序。
|
|
96
|
+
|
|
97
|
+
## 3. 消息持久交付与 Gateway 迁移
|
|
98
|
+
|
|
99
|
+
```mermaid
|
|
100
|
+
flowchart LR
|
|
101
|
+
A[Push 或 Pull 页] --> B[解密校验与批次事件]
|
|
102
|
+
B --> C[应用事务提交]
|
|
103
|
+
C -->|成功| D[SDK 推进交付水位并 ACK]
|
|
104
|
+
C -->|失败或崩溃| E[保留重放责任]
|
|
105
|
+
E --> C
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
同类 batch 有订阅时,该页以 batch 交付。应用返回入库 Promise,按接收身份、会话、消息 ID 与事件语义持久幂等。已读状态由用户阅读后单独提交。
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
const sent = await client.message.send({ to: 'alice.agentid.cn',
|
|
112
|
+
payload: { type: 'text', text: '你好' }, encrypt: true, need_render: true });
|
|
113
|
+
const pendingPeers = await client.message.peers({ filter: 'pending' });
|
|
114
|
+
const peerPage = await client.message.pull({ sender_aid: 'alice.agentid.cn', limit: 200 });
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
`message.peers()` 提供服务端消费目录;History 用于浏览,实时交付由 Push/Pull 共同推进。发送成功表示服务接收结果,应用另行跟踪对端交付和已读。
|
|
118
|
+
|
|
119
|
+
```mermaid
|
|
120
|
+
sequenceDiagram
|
|
121
|
+
participant A as 应用
|
|
122
|
+
participant S as SDK
|
|
123
|
+
participant G as Gateway
|
|
124
|
+
G->>S: gateway.migrate
|
|
125
|
+
S->>S: 校验身份、revision、期限与同 issuer WSS 目标
|
|
126
|
+
S-->>A: gateway.migrate
|
|
127
|
+
S->>S: 新调用返回连接错误,收束同步,保留已提交水位
|
|
128
|
+
S->>G: 目标连接重新认证
|
|
129
|
+
S-->>A: 认证成功后 state_change: ready
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
迁移由 SDK 自动执行;界面读取 `client.state`,失败按错误分类重连。写操作在调用前保存固定业务键,出现结果未知时先查询原操作结果,再按原幂等材料恢复。连接退避、过期 transport 回调和旧会话隔离由 SDK 管理。
|
|
133
|
+
|
|
134
|
+
## 4. 结构化凭证
|
|
135
|
+
|
|
136
|
+
`aun-cap/1` 继续用于可机器判定的能力、资源与约束。语义凭证提供另一种正文表达,原结构化流程继续适用。
|
|
137
|
+
|
|
138
|
+
```mermaid
|
|
139
|
+
flowchart LR
|
|
140
|
+
A[签发者 create CAP] --> B[固定请求并登记]
|
|
141
|
+
B --> C[验登记回执并保存]
|
|
142
|
+
C --> D[可信证书与 fresh 当前状态]
|
|
143
|
+
D --> E[完整 Verify:链、能力、约束、实际请求]
|
|
144
|
+
E --> F[成员或代表资格与应用事务执行]
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
```ts
|
|
148
|
+
const capExpiresAt = Math.min(Math.trunc(Date.now() / 1000) + 1800,
|
|
149
|
+
Math.floor(signer.certNotAfter.getTime() / 1000));
|
|
150
|
+
const structured = client.credential.create({
|
|
151
|
+
sub: signer.aid, aud: [businessAid], delegate: false,
|
|
152
|
+
exp: capExpiresAt, key_version: signer.certFingerprint,
|
|
153
|
+
cap: [{ ns: 'files', action: 'read', resource: '/reports', constraints: [
|
|
154
|
+
{ type: 'max_value', field: 'rows', value: 10 },
|
|
155
|
+
{ type: 'allowed_values', field: 'format', value: ['csv'] },
|
|
156
|
+
] }],
|
|
157
|
+
}, signer);
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
`loadStructuredTrust` 预先取得并校验整条链的证书和当前状态证明,再提供同步 resolver。证书按受信根、身份、指纹与签署时点验收;状态证明绑定权威和本次查询。
|
|
161
|
+
|
|
162
|
+
```ts
|
|
163
|
+
type StructuredTrust = Required<Pick<CredentialVerificationContext,
|
|
164
|
+
'resolveCertificate' | 'resolveStatusProof'>>;
|
|
165
|
+
declare function loadStructuredTrust(value: JsonObject): Promise<StructuredTrust>;
|
|
166
|
+
const structuredTrust = await loadStructuredTrust(structured);
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
本例将业务参数及请求标识完整纳入摘要,使用公开的规范 JSON 摘要入口:
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
const capNow = Math.trunc(Date.now() / 1000);
|
|
173
|
+
const capOperation = { rows: 5, format: 'csv', request_id: randomUUID(),
|
|
174
|
+
nonce: randomBytes(32).toString('base64url') };
|
|
175
|
+
const capBinding = { request_id: capOperation.request_id, nonce: capOperation.nonce,
|
|
176
|
+
target: businessAid, method: 'reports.read', params_hash: sp.digest(capOperation),
|
|
177
|
+
iat: capNow, exp: capNow + 300, credential_cid: String(structured.cid) };
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
验收端从认证通道取得实际主体与下列请求材料;示例中签发者同时为持有人。
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
const capReport = client.credential.verify(structured, { ...structuredTrust,
|
|
184
|
+
audience: businessAid, subject: signer.aid, rootIssuer: signer.aid,
|
|
185
|
+
ns: 'files', action: 'read', resource: '/reports', params: capOperation,
|
|
186
|
+
method: 'reports.read', target: businessAid, requestId: capOperation.request_id,
|
|
187
|
+
nonce: capOperation.nonce, requestBinding: capBinding,
|
|
188
|
+
});
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
`verifySignature()` 用于签名预检,完整业务验收使用 `verify()`。委托逐层收窄能力、约束、受众和期限;成员 CAP 接入成员绑定与当前成员状态,代表调用接入实际 actor、代表证明及当前资格。登记、转交登记、状态查询、普通 CRL 分页和恢复的完整示例见 [凭证专题 §3](凭证与组织服务SDK应用集成指南.md#3-结构化凭证接入)。
|
|
192
|
+
|
|
193
|
+
## 5. 语义与混合凭证
|
|
194
|
+
|
|
195
|
+
### 5.1 签发、确认与登记
|
|
196
|
+
|
|
197
|
+
| 模式 | 材料与验收 |
|
|
198
|
+
| --- | --- |
|
|
199
|
+
| 纯语义 | `aun-cap/semantic-1`、`cap=[]`,正文与确认元数据表达授权 |
|
|
200
|
+
| 混合 | 同一版本、非空 cap,结构化范围与语义限制共同验收 |
|
|
201
|
+
| 结构化父层 | package 保存 legacy 材料,由可信 `legacyVerifier` 完整验证 |
|
|
202
|
+
|
|
203
|
+
```mermaid
|
|
204
|
+
sequenceDiagram
|
|
205
|
+
participant I as 签发者
|
|
206
|
+
participant K as 有权确认者
|
|
207
|
+
participant C as Credential 权威
|
|
208
|
+
I->>I: signCredential 保留原字节
|
|
209
|
+
I->>K: 原件与确认权依据
|
|
210
|
+
K->>K: signMetadata 确定主体、受众、期限与额度
|
|
211
|
+
K->>C: register+固定管理材料
|
|
212
|
+
C-->>K: 逐受众 revision 与签名回执
|
|
213
|
+
K->>K: 持久保存原件、元数据及结果
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
下列端口提供固定版本策略、确认者身份、管理权限和证书信任;示例让当前身份兼任签发者与确认者,接入方核实其实际权限。
|
|
217
|
+
|
|
218
|
+
```ts
|
|
219
|
+
declare const trust: SemanticRecordVerificationContext;
|
|
220
|
+
declare const policy: sp.PolicyRef;
|
|
221
|
+
declare const confirmationPolicy: sp.PolicyRef;
|
|
222
|
+
declare const authority: sp.SemanticManagementBase['authority'];
|
|
223
|
+
declare function saveMaterial(key: string, value: unknown): Promise<void>;
|
|
224
|
+
const options = { serviceAid: credentialServiceAid, verificationContext: trust };
|
|
225
|
+
const semanticNow = Math.trunc(Date.now() / 1000), semanticCid = randomUUID();
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
```ts
|
|
229
|
+
const textGrant = { ver: 'aun-cap/semantic-1', cid: semanticCid, cap: [],
|
|
230
|
+
iss: signer.aid, sub: signer.aid, aud: [businessAid], delegate: false,
|
|
231
|
+
nbf: semanticNow, exp: semanticNow + 1800,
|
|
232
|
+
authorization: { kind: 'text', text: '允许持有人在30分钟内读取月报,次数不限,返回CSV,每次最多10行。' },
|
|
233
|
+
} satisfies Omit<sp.SemanticCredential, 'signature'>;
|
|
234
|
+
const original = await client.credential.signCredential(textGrant, signer);
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
```ts
|
|
238
|
+
const metadata = await client.credential.signMetadata({
|
|
239
|
+
original_hash: sp.digest(sp.decodeSignedJson(original)), version: 'm1',
|
|
240
|
+
confirmed_at: semanticNow, iss: signer.aid, sub: signer.aid, aud: [businessAid],
|
|
241
|
+
nbf: semanticNow, exp: semanticNow + 1800, use_limit: null, delegate: false, policy,
|
|
242
|
+
confirmation: { authority: signer.aid, authorization: confirmationPolicy,
|
|
243
|
+
audiences: [businessAid] },
|
|
244
|
+
}, signer);
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
```ts
|
|
248
|
+
const registrationInput = { request_id: randomUUID(),
|
|
249
|
+
nonce: randomBytes(32).toString('base64url'), credential_cid: semanticCid,
|
|
250
|
+
authority, original, metadata: [metadata], lineage_evidence: [],
|
|
251
|
+
} satisfies sp.SemanticFacadeInput<sp.SemanticRegisterParams>;
|
|
252
|
+
await saveMaterial('semantic-registration-input', registrationInput);
|
|
253
|
+
const registered = await client.credential.register(registrationInput, options);
|
|
254
|
+
await saveMaterial('semantic-registration-result', registered);
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
管理 Facade 自动生成 `request_binding`;重试读取保存的原 input。`SignedJsonBytes` 保留签名 JSON 的 UTF-8 原字节。次数、累计额度、无限期及派生凭证的完整接法见 [凭证专题 §4.2](凭证与组织服务SDK应用集成指南.md#42-签发确认与登记e02e05e18)。
|
|
258
|
+
|
|
259
|
+
### 5.2 来源链、当前状态与实际业务请求
|
|
260
|
+
|
|
261
|
+
`loadPresentation` 从保存材料取得 root→leaf,并为各层取得本次状态;`loadPackageContext` 以实际请求的 aud 为受众,提供可信证书、签发者和逐 CID 权威、状态策略、online 查询绑定与真实耗时。跨域逐层选择权威。
|
|
262
|
+
|
|
263
|
+
```ts
|
|
264
|
+
declare function loadPresentation(): Promise<sp.CredentialLineageEntry[]>;
|
|
265
|
+
declare function loadPackageContext(input: sp.AuthorizationRequest): Promise<SemanticPackageVerificationContext>;
|
|
266
|
+
const grant = await client.credential.buildPackage(await loadPresentation());
|
|
267
|
+
const request = await client.credential.buildRequest({ request_id: randomUUID(),
|
|
268
|
+
nonce: randomBytes(32).toString('base64url'), actor: signer.aid, sub: signer.aid,
|
|
269
|
+
target: businessAid, aud: businessAid, ns: 'files', action: 'read', resource: '/reports',
|
|
270
|
+
params: { rows: 5, format: 'csv' }, expires_at: Math.trunc(Date.now() / 1000) + 300, grant });
|
|
271
|
+
await saveMaterial('semantic-business-request', request);
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
```ts
|
|
275
|
+
declare function authenticatedContext(): Promise<sp.AuthenticatedAUNContext>;
|
|
276
|
+
const authentication = await authenticatedContext();
|
|
277
|
+
const requestReport = await client.credential.verifyRequest(request, authentication);
|
|
278
|
+
const packageContext = await loadPackageContext(request);
|
|
279
|
+
const packageReport = await client.credential.verifyPackage(request.grant, packageContext);
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
| 策略 | 接入要求 |
|
|
283
|
+
| --- | --- |
|
|
284
|
+
| online | 绑定本次 request_hash/nonce、受众与期望 revision,本地查询耗时严格 `<30秒` |
|
|
285
|
+
| bounded | `max_staleness_seconds≤300`,按本地首次观察的单调时钟消费 TTL |
|
|
286
|
+
| 冷恢复 | 重取当前时效证据;重复读取同一证明保留原 TTL 起点 |
|
|
287
|
+
| 撤销 | 按权威、CID、受众/scope 隔离状态序号,旧证明保留较新撤销事实 |
|
|
288
|
+
|
|
289
|
+
当前态 ±300 秒容错用于当前证书、回执和状态窗口;历史签署时点与本地签名资格按原证书期限验收。消费 TTL 与最大声明生命周期另按固定上限验收。
|
|
290
|
+
|
|
291
|
+
### 5.3 正文证据、模型与业务执行
|
|
292
|
+
|
|
293
|
+
```mermaid
|
|
294
|
+
flowchart LR
|
|
295
|
+
A[已验来源链与认证请求] --> B[text 原件或 message_ref 原始证据]
|
|
296
|
+
B --> C[逐层验证正文、上下文与附件]
|
|
297
|
+
C --> D[固定事实和版本策略,构建 DecisionInput]
|
|
298
|
+
D --> E{模型与业务复核}
|
|
299
|
+
E -->|allow 且后置条件通过| F[额度预留与幂等事务执行]
|
|
300
|
+
E -->|deny 或 indeterminate| G[返回拒绝或补充材料项]
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
正常 P2P/群收取附带 `_semantic_evidence`。应用保全原 envelope、解密 payload 字节、接收身份/设备及原收件密钥;历史发送者按原签署时间与证书指纹验证。拆分收件行使用 Merkle 证明,归档定位器固定对象版本和摘要。
|
|
304
|
+
|
|
305
|
+
```ts
|
|
306
|
+
declare function loadMessageContext(): Promise<sp.SemanticMessageVerificationContext>;
|
|
307
|
+
declare const referencedCredential: sp.SemanticCredential;
|
|
308
|
+
const verifiedBody = await client.credential.verifyMessageBody(
|
|
309
|
+
referencedCredential, await loadMessageContext());
|
|
310
|
+
const inlineEvidence = await client.credential.createEvidenceRef(
|
|
311
|
+
new TextEncoder().encode('已核验的附件原文'), 'aun-evidence-bytes/1');
|
|
312
|
+
const restoredEvidence = await client.credential.resolveEvidence(inlineEvidence);
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
`loadVerifiedBodies` 为全部适用语义层收集已验正文;`loadFacts` 只提供可信业务事实。模型和原子执行由应用端口实现。
|
|
316
|
+
|
|
317
|
+
```ts
|
|
318
|
+
declare function loadVerifiedBodies(value: sp.CredentialPackage): Promise<sp.VerifiedBody[]>;
|
|
319
|
+
declare function loadFacts(): Promise<sp.JsonObject>;
|
|
320
|
+
declare function review(input: sp.DecisionInput): Promise<sp.SemanticResult>;
|
|
321
|
+
declare function executeAccepted(input: sp.DecisionInput,
|
|
322
|
+
reports: { request: typeof requestReport; package: typeof packageReport }): Promise<void>;
|
|
323
|
+
const decisionInput = await client.credential.buildDecisionInput(
|
|
324
|
+
request, await loadVerifiedBodies(request.grant), await loadFacts(), policy);
|
|
325
|
+
const decision = await review(decisionInput);
|
|
326
|
+
if (decision.verdict === 'allow') await executeAccepted(decisionInput,
|
|
327
|
+
{ request: requestReport, package: packageReport });
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
`checked` 列出协议已验项目,`required` 列出剩余接线。`executeAccepted` 核实签发/确认权、父层语义、能力交集、业务后置条件和额度预留,并以原 request_hash 原子保存执行结果。
|
|
331
|
+
|
|
332
|
+
### 5.4 修订、撤销与 Usage 恢复
|
|
333
|
+
|
|
334
|
+
```mermaid
|
|
335
|
+
flowchart LR
|
|
336
|
+
A[固定原 request ID、nonce、revision 与候选材料] --> B{操作}
|
|
337
|
+
B --> C[受众修订或撤销]
|
|
338
|
+
B --> D[Usage prepare:冻结与核对 Unknown]
|
|
339
|
+
D --> E[关闭分配,收集 checkpoint 与 acceptance]
|
|
340
|
+
E --> F[commit 或 abort]
|
|
341
|
+
C --> G[验证回执并保存当前序号]
|
|
342
|
+
F --> G
|
|
343
|
+
G --> H[中断后查询原协调状态再续办]
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
SDK 签验 allocation、在线 allocation status、transition、checkpoint、acceptance 和 abort 材料;业务账本负责预留、Unknown 核对、实际结算、跨权威容量与原子事务。语义 CRL 固定快照上界、scope、limit、原 cursor 续页,页验签与进度原子持久提交。
|
|
347
|
+
|
|
348
|
+
详细代码与 E02—E36 对照见 [凭证专题 §4](凭证与组织服务SDK应用集成指南.md#4-语义凭证接入),持久账本见 [reference-host](../../examples/semantic-credential/reference-host/ledger.py)。
|
|
349
|
+
|
|
350
|
+
## 6. 组织成员与实体身份
|
|
351
|
+
|
|
352
|
+
```mermaid
|
|
353
|
+
flowchart LR
|
|
354
|
+
A[owner 与持久 AIDStore] --> B[createOrg:实体身份与本次创建确认]
|
|
355
|
+
B --> C[按实体证书和原条件发布名片]
|
|
356
|
+
C --> D[申请或邀请,双方绑定与成员 CAP]
|
|
357
|
+
D --> E[prepareRequest:实际 actor、凭证和请求绑定]
|
|
358
|
+
E --> F[当前成员或代表资格验收]
|
|
359
|
+
F --> G[转让接受后持久新身份与确认结果]
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
```ts
|
|
363
|
+
const organization = await client.createOrg({ org_id: 'team.agentid.cn',
|
|
364
|
+
name: '协作组织' }, { aidStore: store });
|
|
365
|
+
const orgQuery = client.org.prepareRequest('org.member.get', {
|
|
366
|
+
org_id: 'team.agentid.cn', member_aid: signer.aid,
|
|
367
|
+
}, 'org.agentid.cn', signer);
|
|
368
|
+
const member = await client.org.member.get(orgQuery);
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
创建/转让 checkpoint 保存候选密钥、原请求和已确认阶段。NS 明确缺少实体名片投影时,SDK 按本次 active 结果、owner 与实体证书初始化;转让续办绑定已确认 transfer ID 和新身份。组织与群使用专属实体生命周期。
|
|
372
|
+
|
|
373
|
+
申请、邀请、续期、冻结/退出、跨设备代表及转让的短 TS 流程见 [凭证专题 §5—§7](凭证与组织服务SDK应用集成指南.md#5-组织成员流程);CLI 开发与操作见 [CLI 指南](../cli/凭证与组织服务CLI开发与使用指南.md)。
|
|
374
|
+
|
|
375
|
+
## 7. 名片、Ownership 与读缓存
|
|
376
|
+
|
|
377
|
+
沿用 `0.5.24` 的文件/NS 归属流程:绑定、释放和转移在当次操作提交文件与通知,由 NS 当前事实验收。带 owner 注册仍需要 owner 确认;本地双身份使用 `bindLocalSubaid`/`transferLocalSubaid`。
|
|
378
|
+
|
|
379
|
+
```ts
|
|
380
|
+
const profile = await store.resolve('alice.agentid.cn', { ownership: client });
|
|
381
|
+
if (!profile.ok) throw new Error(profile.error.message);
|
|
382
|
+
console.log(profile.data.agent_md?.frontmatter, profile.data.ownership?.status);
|
|
383
|
+
const refreshed = await store.resolve('alice.agentid.cn', {
|
|
384
|
+
forceRefresh: true, ownership: client, ownershipTtlMs: 0 });
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
名片关系展示按 ETag、完整正文和 observation 复用;管理授权使用当前权威证据。Storage/Group FS 继续使用各自读缓存策略。Ownership 当次编排与凭证/组织的持久 checkpoint 分别管理,详情见 [0.5.24 应用指南](0.5.24-SDK应用集成指南.md#5-ownership文件提交ns-验收与本地编排)。
|
|
388
|
+
|
|
389
|
+
## 8. 四端升级与验收
|
|
390
|
+
|
|
391
|
+
| SDK | 接入差异 |
|
|
392
|
+
| --- | --- |
|
|
393
|
+
| TypeScript | Node 文件 store;普通 CAP helper 同步,语义方法异步;跨域第二参数 `{serviceAid}` |
|
|
394
|
+
| JavaScript | `@agentunion/fastaun-browser`;IndexedDB/WebCrypto 异步,HTTPS 信任交给浏览器 |
|
|
395
|
+
| Python | RPC 与语义签验 async,管理调用 `target=`;CLI 复用同一 SDK 编排 |
|
|
396
|
+
| Go | `context`/`error`;`client.Credential()`,跨域 `NewCredentialFacade(client, serviceAID)` |
|
|
397
|
+
|
|
398
|
+
```mermaid
|
|
399
|
+
flowchart LR
|
|
400
|
+
A[核对四端实际包版本 0.5.27] --> B[保留身份、设备、slot 与持久材料]
|
|
401
|
+
B --> C[本地类型检查与协议向量]
|
|
402
|
+
C --> D[消息重放、当前状态及中断恢复]
|
|
403
|
+
D --> E[按实际使用场景执行 CN、双域或浏览器 E2E]
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
验收覆盖普通 CAP 的登记/委托/完整 Verify/撤销,语义 CAP 的文本/消息证据/来源链/三态复核/受众修订/Usage/冷恢复,以及组织申请/邀请/续期/代表/转让。用例与断点续跑方式见 [测试运行指南](../aun测试运行指南.md)及 [示例场景与已有验证边界](../../examples/semantic-credential/示例使用指南.md#5-本轮验证记录与边界)。
|
|
407
|
+
|
|
408
|
+
结束当前会话调用 `await client.close()`;需要继续使用同一 client 时调用 `await client.disconnect()` 后重新连接。本文与此前阶段测试记录共同描述当前工作区,最终发布包仍按实际安装产物验收。
|