@agentunion/fastaun-browser 0.4.4 → 0.4.5

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.
Files changed (45) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/_packed_docs/CHANGELOG.md +13 -0
  3. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +1 -1
  4. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +1 -1
  5. package/dist/aid-store.d.ts +1 -0
  6. package/dist/aid-store.d.ts.map +1 -1
  7. package/dist/aid-store.js +26 -9
  8. package/dist/aid-store.js.map +1 -1
  9. package/dist/auth.d.ts +8 -13
  10. package/dist/auth.d.ts.map +1 -1
  11. package/dist/auth.js +37 -130
  12. package/dist/auth.js.map +1 -1
  13. package/dist/bundle.js +644 -210
  14. package/dist/client.d.ts +5 -4
  15. package/dist/client.d.ts.map +1 -1
  16. package/dist/client.js +64 -66
  17. package/dist/client.js.map +1 -1
  18. package/dist/index.d.ts +1 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/keystore/index.d.ts +45 -22
  23. package/dist/keystore/index.d.ts.map +1 -1
  24. package/dist/keystore/index.js +6 -1
  25. package/dist/keystore/index.js.map +1 -1
  26. package/dist/keystore/indexeddb.d.ts +11 -1
  27. package/dist/keystore/indexeddb.d.ts.map +1 -1
  28. package/dist/keystore/indexeddb.js +167 -18
  29. package/dist/keystore/indexeddb.js.map +1 -1
  30. package/dist/register-flow.d.ts +34 -0
  31. package/dist/register-flow.d.ts.map +1 -0
  32. package/dist/register-flow.js +355 -0
  33. package/dist/register-flow.js.map +1 -0
  34. package/dist/v2/session/keystore.d.ts +5 -0
  35. package/dist/v2/session/keystore.d.ts.map +1 -1
  36. package/dist/v2/session/keystore.js +29 -0
  37. package/dist/v2/session/keystore.js.map +1 -1
  38. package/dist/version.d.ts +1 -1
  39. package/dist/version.js +1 -1
  40. package/package.json +1 -1
  41. package/_packed_docs/0.4.0_/345/267/256/345/274/202/346/240/270/345/256/236/345/206/263/347/255/226/350/256/260/345/275/225.md +0 -302
  42. package/_packed_docs/AUN_SDK_0.4.0_/350/256/276/350/256/241/345/257/271/346/257/224/345/210/206/346/236/220.md +0 -194
  43. package/_packed_docs/AUN_SDK_/351/207/215/346/236/204/345/256/236/346/226/275/350/256/241/345/210/222.md +0 -596
  44. package/_packed_docs/AUN_SDK_/351/207/215/346/236/204/350/256/276/350/256/241/346/226/271/346/241/210_v3.md +0 -1698
  45. package/_packed_docs/python-sdk-v2-only-changelog.md +0 -189
@@ -1,302 +0,0 @@
1
- # AUN SDK 0.4.0 差异核实决策记录
2
-
3
- **创建日期**:2026-05-30
4
-
5
- ---
6
-
7
- ## #1 / #2 / #3 — `load()` / `list()` / `changeSeed()` 同步 vs 异步
8
-
9
- | 方法 | 设计文档 | TS | JS | Python | Go |
10
- |------|---------|----|----|--------|-----|
11
- | `load()` | Promise | 同步 | 异步 | 同步 | 同步 |
12
- | `list()` | Promise | 同步 | 异步 | 同步 | 同步 |
13
- | `changeSeed()` | Promise | 同步 | 异步 | 同步 | 同步 |
14
-
15
- **决策**:设计文档改为同步。JS SDK 允许保持异步作为平台例外。
16
-
17
- **原因**:
18
- 1. 三个方法都是纯本地操作(读文件、扫目录、重加密私钥),不涉及网络IO
19
- 2. 毫秒级完成,无需异步
20
- 3. 同步API更简洁,调用方不需要 await
21
- 4. TS/Python/Go 三个SDK已经是同步实现,JS 是唯一的异步版本
22
- 5. JS 保持异步的原因:底层存储是 IndexedDB(浏览器原生 API),所有操作均为异步,无同步版本,**无法改为同步,属于平台硬约束**
23
-
24
- **行动项**:
25
- - [ ] 更新设计文档 `load()` / `list()` / `changeSeed()` 签名为同步
26
- - [ ] 设计文档中注明 JS SDK 因浏览器环境限制保持异步
27
-
28
- ---
29
-
30
- ## #4 — `resolve()` 等方法返回类型精度
31
-
32
- | 方法 | 设计文档 | TS/JS | Python | Go |
33
- |------|---------|-------|--------|-----|
34
- | `resolve()` | 强类型 | ✅ `ResolveResult` | ✅ `ResolveResult` TypedDict | ✅ 强类型 |
35
- | `fetchAgentMd()` | 强类型 | ✅ `FetchAgentMdResult` | ✅ `FetchAgentMdResult` TypedDict | ✅ 强类型 |
36
- | `headAgentMd()` | 强类型 | ✅ `HeadAgentMdResult` | ✅ `HeadAgentMdResult` TypedDict | ✅ 强类型 |
37
- | `checkAgentMd()` | 强类型 | ✅ `CheckAgentMdResult` | ✅ `CheckAgentMdResult` TypedDict | ✅ 强类型 |
38
- | `diagnose()` | 强类型 | ✅ `DiagnoseResult` | ✅ `DiagnoseResult` TypedDict | ✅ 强类型 |
39
- | `renewCert()` | 强类型 | ✅ `RenewCertResult` | ✅ `RenewCertResult` TypedDict | ✅ 强类型 |
40
- | `rekey()` | 强类型 | ✅ `RekeyResult` | ✅ `RekeyResult` TypedDict | ✅ 强类型 |
41
-
42
- **决策**:所有 SDK 均改为强类型返回。**已全部完成(v0.4.2)。**
43
-
44
- **行动项**:
45
- - [x] TS/JS `aid-store.ts` 定义具名类型,替换 `Record<string, unknown>`
46
- - [x] Python `aid_store.py` 定义对应 TypedDict,替换 `dict[str, Any]`
47
- - [ ] 更新设计文档类型定义章节
48
-
49
- ---
50
-
51
- ## #5 — AIDStore 额外构造参数
52
-
53
- | 参数 | 设计文档 | 各SDK现状 | 决策 |
54
- |------|---------|----------|------|
55
- | `aunPath` | ✅ 有 | 全部有 | 保留 |
56
- | `encryptionSeed` | ✅ 有 | 全部有 | 保留 |
57
- | `deviceId?` | ✅ 有 | 全部有 | 保留 |
58
- | `slotId?` | ✅ 有 | 全部有 | 保留 |
59
- | `verifySsl?` | ❌ 无 | 全部有 | **保留,补充进设计文档** |
60
- | `rootCaPath?` | ❌ 无 | 全部有 | **保留,补充进设计文档** |
61
- | `debug?` | ❌ 无 | 全部有 | **保留,补充进设计文档** |
62
- | `discoveryPort?` | ❌ 无 | 全部有 | **移除** ✅ |
63
-
64
- **决策**:
65
- - 保留 `verifySsl`、`rootCaPath`、`debug`,补充进设计文档
66
- - 移除 `discoveryPort`:服务发现不应指定端口,端口应由服务发现机制自动解析
67
- - **已全部完成(v0.4.2):`discoveryPort` 已从四个 SDK 移除;`rootCaPath` 已加入。**
68
-
69
- **原因**:
70
- - `verifySsl`:测试环境需要关闭 SSL 校验,实用参数
71
- - `rootCaPath`:私有部署需要自定义根证书,必要参数
72
- - `debug`:控制日志级别,调试必备
73
- - `discoveryPort`:硬编码端口违背服务发现的设计意图,应由 gateway URL 或 DNS SRV 等机制自动确定
74
-
75
- **行动项**:
76
- - [x] 设计文档 AIDStore 构造参数补充 `verifySsl?`、`rootCaPath?`、`debug?`(待同步文档)
77
- - [x] 各 SDK 移除 `discoveryPort` 参数及相关逻辑
78
- - [x] 移除后 agent.md URL 拼接改为从 gateway URL 自动推导端口
79
-
80
- ---
81
-
82
- ## #6 — `AIDStore.close()` 方法
83
-
84
- | | 设计文档 | TS | JS | Python | Go |
85
- |---|---------|----|----|--------|-----|
86
- | `close()` | 未提及 | 存在 | 存在 | 存在 | 存在 |
87
-
88
- **决策**:保留,补充进设计文档。
89
-
90
- **原因**:AIDStore 内部持有 HTTP client、缓存等资源,需要显式释放。所有 SDK 已实现,属于合理的资源管理方法。
91
-
92
- **行动项**:
93
- - [ ] 设计文档 AIDStore 操作表补充 `close()` 方法
94
-
95
- ---
96
-
97
- ## #7 — AID 额外属性 `deviceId` / `slotId`
98
-
99
- | | 设计文档 | TS | JS | Python | Go |
100
- |---|---------|----|----|--------|-----|
101
- | `AID.deviceId` | 无 | `readonly deviceId: string` | 同TS | `device_id: str` | 有 |
102
- | `AID.slotId` | 无 | `readonly slotId: string` | 同TS | `slot_id: str` | 有 |
103
-
104
- **决策**:保留,补充进设计文档 AID 只读属性列表。
105
-
106
- **原因**:AID 携带创建它的 AIDStore 的 deviceId/slotId,AUNClient 连接时需要传给服务端标识消费通道。这是多设备/多实例支持的必要信息传递路径。
107
-
108
- **行动项**:
109
- - [ ] 设计文档 2.5 AID 只读属性表补充 `deviceId` 和 `slotId`
110
-
111
- ---
112
-
113
- ## #8 — AIDInfo 额外字段 `certFingerprint`
114
-
115
- | | 设计文档 | TS | JS | Python | Go |
116
- |---|---------|----|----|--------|-----|
117
- | `AIDInfo` | `{ aid, certNotAfter, certIssuer }` | 多了 `certFingerprint` | 同TS | 多了 `cert_fingerprint` | 多了 `CertFingerprint` |
118
-
119
- **决策**:保留,补充进设计文档 `AIDInfo` 类型定义。
120
-
121
- **原因**:证书 SHA-256 指纹是身份的唯一标识,列出身份时提供 fingerprint 便于比对、日志和 UI 展示,无额外开销(load 时已计算)。
122
-
123
- **行动项**:
124
- - [ ] 设计文档 2.2 `AIDInfo` 类型定义补充 `certFingerprint: string`
125
-
126
- ---
127
-
128
- ## #9 — AUNClient 构造签名
129
-
130
- | | 设计文档 | TS | JS | Python | Go |
131
- |---|---------|----|----|--------|-----|
132
- | 构造签名 | `constructor(aid?: AID)` | ✅ `constructor(aid?: AID)` | ✅ `constructor(aid?: AID)` | ✅ `__init__(aid=None)` | ✅ `NewAUNClient(aid *AID)` |
133
-
134
- **决策**:收紧为设计文档的纯粹设计——`constructor(aid?: AID)`,移除 options 重载。**已全部完成(v0.4.2)。**
135
-
136
- **机制**:
137
- - AIDStore 在 `load()` 时将必要配置(`aunPath`、`verifySsl`、`rootCaPath`、`debug`)作为只读属性附加到 AID 对象
138
- - AUNClient 从 AID 对象上读取所有配置,不再单独接受 options 参数
139
- - Go 额外:`LoadIdentity(aid)` 在 aunPath 变化时自动重建 keystore/auth/net(对齐 Python `_rebuild_runtime_for_identity`)
140
-
141
- **行动项**:
142
- - [x] 各 SDK 移除 AUNClient 的 options 重载,只保留 `constructor(aid?: AID)`
143
- - [x] AID 对象携带只读属性:`aunPath`、`verifySsl`、`rootCaPath`、`debug`(由 AIDStore.load() 注入)
144
- - [ ] 设计文档 AID 只读属性表补充上述字段
145
- - [ ] 设计文档明确 AUNClient 必须通过 AIDStore 创建的 AID 使用
146
-
147
- ---
148
-
149
- ## #10 — `setLocalAgentMdPath` 方法
150
-
151
- | | 设计文档 | TS | JS | Python | Go |
152
- |---|---------|----|----|--------|-----|
153
- | `setLocalAgentMdPath` | 已移除 | ✅ 已移除 | ✅ 已移除 | ✅ 已移除 | ✅ 已移除 |
154
-
155
- **决策**:从各 SDK 中移除。**已全部完成(v0.4.0)。**
156
-
157
- **行动项**:
158
- - [x] TS/JS/Python/Go 各 SDK 删除 `setLocalAgentMdPath` 方法及相关逻辑
159
-
160
- ---
161
-
162
- ## #11 — `uploadAgentMd` 可见性
163
-
164
- | | 设计文档 | TS | JS | Python | Go |
165
- |---|---------|----|----|--------|-----|
166
- | `uploadAgentMd` | 公开 | 私有 `_uploadAgentMd` | 同TS | 私有 | 私有 |
167
-
168
- **决策**:`uploadAgentMd` 保持私有,设计文档删除该公开方法。
169
-
170
- **原因**:`publishAgentMd` 已封装签名+上传全流程,无需再暴露裸上传接口,减少公开 API 面。
171
-
172
- **行动项**:
173
- - [ ] 设计文档 3.2.4 方法可用性矩阵及 4.3 操作表删除 `uploadAgentMd` 行
174
-
175
- ---
176
-
177
- ## #12 — `authenticate()` 状态约束
178
-
179
- | | 设计文档 | TS/JS | Python | Go |
180
- |---|---------|-------|--------|-----|
181
- | 允许状态 | 仅 Standby | ✅ 仅 Standby | ✅ 仅 Standby | ✅ 仅 Standby |
182
-
183
- **决策**:所有 SDK 统一为仅 Standby 状态可调。**已全部完成(v0.4.2)。**
184
-
185
- **行动项**:
186
- - [x] TS/JS 收紧 `authenticate()` 状态检查:移除 Authenticated 状态的允许
187
- - [x] Go 补充显式状态检查:仅 Standby 可调
188
-
189
- ---
190
-
191
- ## #13 — `connect()` 参数
192
-
193
- | | 设计文档 | TS/JS | Python | Go |
194
- |---|---------|-------|--------|-----|
195
- | 参数 | `{ gateway? }` | `connect(options?: RpcParams)` | `connect(options?: dict)` | `Connect(ctx, opts...)` |
196
-
197
- **决策**:`connect()` 无参数,签名改为 `connect(): Promise<void>`。
198
-
199
- **机制**:
200
- - `authenticate()` 执行后,将结果缓存到 AUNClient 私有字段:`_gatewayUrl`、`_accessToken`、`_refreshToken`
201
- - `connect()` 直接使用缓存的 gateway URL 和 token 建立连接
202
- - 若未 authenticate,`connect()` 内部自动先调用 `authenticate()`(使用 AID 中的配置发现 gateway)
203
- - cached token/URL 的复用也在 authenticate 流程内部完成
204
-
205
- **原因**:gateway URL 是认证结果的一部分,不应由调用方传入;connect 只管建连接,不管配置。
206
-
207
- **行动项**:
208
- - [ ] 各 SDK `connect()` 移除参数
209
- - [ ] 设计文档更新 `connect()` 签名为无参数,并说明 gateway URL 来源
210
-
211
- ---
212
-
213
- ## #14 — ConnectionState 命名风格
214
-
215
- | | 设计文档 | TS | JS | Python | Go |
216
- |---|---------|----|----|--------|-----|
217
- | 命名 | kebab-case | snake_case | snake_case | snake_case | snake_case |
218
-
219
- **决策**:以 SDK 的 snake_case 为准,设计文档更新。
220
-
221
- **原因**:kebab-case(含 `-`)在多数语言中不是合法标识符,snake_case 跨语言通用。
222
-
223
- **行动项**:
224
- - [ ] 设计文档全文将 `'no-identity'`、`'retry-backoff'`、`'connection-failed'` 等改为 snake_case
225
-
226
- ---
227
-
228
- ## #15 — `ResolveOpts.timeout` 缺失
229
-
230
- | | 设计文档 | TS | JS | Python | Go |
231
- |---|---------|----|----|--------|-----|
232
- | `timeout?` | 有,默认 10000ms | ✅ 已实现 | 待核实 | 待核实 | ✅ 已实现 |
233
-
234
- **决策**:各 SDK 补充 `timeout` 参数,默认值 10000ms,与设计文档一致。
235
-
236
- **行动项**:
237
- - [x] TS `ResolveOpts` 补充 `timeout?: number`,默认 10000
238
- - [ ] JS `ResolveOpts` 补充 `timeout?: number`,默认 10000
239
- - [ ] Python `resolve()` 补充 `timeout: int = 10000`
240
- - [x] Go `AIDStoreResolveOptions` 补充 `Timeout time.Duration`,默认 10s
241
-
242
- ---
243
-
244
- ## #17 — `changeSeed()` 返回类型不一致
245
-
246
- | | 设计文档 | TS | JS | Python | Go |
247
- |---|---------|----|----|--------|-----|
248
- | 返回 | `Result<{ changed: true, count: number }>` | ✅ `Result<ChangeSeedResult>` | ✅ `Result<ChangeSeedResult>`(async) | ✅ `Result[ChangeSeedResult]` | ✅ `Result[ChangeSeedResult]` |
249
-
250
- **决策**:统一为强类型,`{ changed: boolean; count: number }`。**已全部完成(v0.4.2)。**
251
-
252
- **行动项**:
253
- - [x] Python `change_seed()` 返回类型改为 `Result[ChangeSeedResult]`
254
- - [x] Go `ChangeSeed()` 返回改为 `Result[ChangeSeedResult]`,含 `Changed bool` + `Count int`
255
-
256
- ---
257
-
258
- ## #18 — `list()` 返回包装不一致
259
-
260
- | | 设计文档 | TS | JS | Python | Go |
261
- |---|---------|----|----|--------|-----|
262
- | 返回 | `Result<{ identities: AIDInfo[] }>` | ✅ 一致 | ✅ 一致(async) | ✅ `Result[ListResult]` | ✅ `Result[ListResult]` |
263
-
264
- **决策**:统一为强类型 Result 包装。**已全部完成(v0.4.2)。**
265
-
266
- **行动项**:
267
- - [x] Python `list()` 返回类型改为 `Result[ListResult]`
268
- - [x] Go `List()` 返回改为 `Result[ListResult]`
269
-
270
- ---
271
-
272
- ## #19/#20 — `resolve()` / `renewCert()` / `rekey()` 返回类型
273
-
274
- 已在 **#4** 中统一决策,此处不重复。
275
-
276
- ---
277
-
278
- ## #21 — `authenticate()` 状态约束跨SDK不一致
279
-
280
- 已在 **#12** 中统一决策,此处不重复。
281
-
282
- ---
283
-
284
- ## #22 — `load()` / `list()` / `changeSeed()` 同步性
285
-
286
- 已在 **#1/#2/#3** 中统一决策,此处不重复。
287
-
288
- ---
289
-
290
- ## #23 — Go 不使用 Result 包装
291
-
292
- | | 设计文档 | TS/JS/Python | Go |
293
- |---|---------|-------------|-----|
294
- | 错误处理 | `Result<T>` | `Result<T>` | ✅ `Result[T]`(泛型,`go/result.go`) |
295
-
296
- **决策**:Go 也统一使用 Result 包装。**已完成(v0.4.2):`go/result.go` 实现泛型 `Result[T]`,AIDStore 所有公开方法已改为 `Result[T]` 返回。**
297
-
298
- **行动项**:
299
- - [x] Go 新增泛型 `Result[T]` 类型(`go/result.go`)
300
- - [x] Go AIDStore 所有公开方法返回值改为 `Result[T]`
301
- - [ ] Go AUNClient 公开方法返回值改为 `Result[T]`(待评估范围)
302
-
@@ -1,194 +0,0 @@
1
- # AUN SDK 0.4.0 — 设计文档 vs 实际实现对比分析
2
-
3
- **分析日期**:2026-05-30
4
- **SDK 版本**:`@agentunion/fastaun@0.4.0`
5
- **对比基准**:`docs/AUN_SDK_重构设计方案_v3.md`(实际标题 v4.0)
6
-
7
- ---
8
-
9
- ## 一、一致的部分
10
-
11
- | 设计项 | SDK 实现 | 状态 |
12
- |--------|----------|:----:|
13
- | **三主体架构** AIDStore / AID / AUNClient | 全部导出,职责分离 | ✅ |
14
- | **AIDStore 构造** `{ aunPath, encryptionSeed, deviceId?, slotId? }` | 完全一致,额外有 `verifySsl`, `discoveryPort`, `rootCaPath`, `debug` | ✅ |
15
- | **AIDStore.load(aid)** 返回 `Result<{ aid: AID }>` | 一致(同步) | ✅ |
16
- | **AIDStore.register(aid)** 返回 `Promise<Result<{ registered: true }>>` | 一致 | ✅ |
17
- | **AIDStore.list()** 返回 `Result<{ identities: AIDInfo[] }>` | 一致(同步) | ✅ |
18
- | **AIDStore.exists(aid)** 返回 `Promise<Result<{ exists: boolean }>>` | 一致 | ✅ |
19
- | **AIDStore.resolve(aid, opts?)** | 一致,`ResolveOpts` 有 `forceRefresh` + `skipAgentMd` | ✅ |
20
- | **AIDStore.fetchAgentMd / headAgentMd / checkAgentMd / diagnose / renewCert / rekey** | 全部存在 | ✅ |
21
- | **AIDStore.changeSeed(old, new)** | 一致(同步) | ✅ |
22
- | **AID 只读属性** `aid`, `aunPath`, `certPem`, `publicKey`, `certSubject`, `certNotBefore`, `certNotAfter`, `certIssuer`, `certFingerprint` | 全部存在 | ✅ |
23
- | **AID.isCertValid() / isPrivateKeyValid()** | 一致 | ✅ |
24
- | **AID.sign / verify / signAgentMd / verifyAgentMd** 返回 `Result<T>` | 一致 | ✅ |
25
- | **VerifyResult** `{ status, payload, reason? }` | 一致,额外有 `aid?`, `cert_fingerprint?`, `timestamp?` | ✅ |
26
- | **Result\<T\>** 统一格式 `{ ok, data } \| { ok, error: { code, message, cause? } }` | 完全一致 | ✅ |
27
- | **AUNClient 构造** 可选传入 AID | 一致:`constructor(options?)` 或 `constructor(aid, options?)` | ✅ |
28
- | **AUNClient.loadIdentity(aid: AID)** | 一致 | ✅ |
29
- | **AUNClient.authenticate() / connect() / disconnect() / close()** | 全部存在 | ✅ |
30
- | **AUNClient.call(method, params)** | 一致 | ✅ |
31
- | **AUNClient.on / off** | 一致 | ✅ |
32
- | **AUNClient capability getters** `hasIdentity`, `canSign`, `canConnect`, `canSend`, `isReady`, `isOnline`, `isClosed` | 全部存在 | ✅ |
33
- | **AUNClient 重连 getters** `nextRetryAt`, `nextRetryInSeconds`, `retryAttempt`, `retryMaxAttempts`, `lastError`, `lastErrorCode` | 全部存在 | ✅ |
34
- | **AUNClient.setProtectedHeaders / getProtectedHeaders** | 一致 | ✅ |
35
- | **AUNClient.publishAgentMd()** | 存在 | ✅ |
36
- | **AUNClient 对端管理** `lookupPeer`, `getPeer`, `cachePeer`, `peers` | 全部存在 | ✅ |
37
- | **ConnectionState 枚举** 9 个状态 | 全部一致 | ✅ |
38
- | **AUNClient.gatewayHealth** getter | 存在 | ✅ |
39
- | **AUNClient.state / currentAid / aunPath** getters | 存在 | ✅ |
40
-
41
- ---
42
-
43
- ## 二、不一致 / 差异
44
-
45
- ### 2.1 同步 vs 异步
46
-
47
- | # | 方法 | 设计文档 | SDK 实际 | 影响 |
48
- |---|------|---------|---------|------|
49
- | 1 | `AIDStore.load()` | `Promise<Result<...>>` | **同步** `Result<{ aid: AID }>` | 调用方不需要 await |
50
- | 2 | `AIDStore.list()` | `Promise<Result<...>>` | **同步** `Result<{ identities: AIDInfo[] }>` | 同上 |
51
- | 3 | `AIDStore.changeSeed()` | `Promise<Result<...>>` | **同步** `Result<{ changed, count }>` | 同上 |
52
-
53
- **评估**:SDK 实现更优(纯本地操作无需异步),设计文档需更新。
54
-
55
- ---
56
-
57
- ### 2.2 类型精度
58
-
59
- | # | 方法 | 设计文档 | SDK 实际 |
60
- |---|------|---------|---------|
61
- | 4 | `AIDStore.resolve()` | `Promise<Result<ResolveData>>`(强类型) | `Promise<Result<Record<string, unknown>>>` |
62
- | 5 | `AIDStore.fetchAgentMd()` | `Promise<Result<AgentMdFetchData>>`(强类型) | `Promise<Result<Record<string, unknown>>>` |
63
- | 6 | `AIDStore.headAgentMd()` | `Promise<Result<AgentMdHeadData>>`(强类型) | `Promise<Result<Record<string, unknown>>>` |
64
- | 7 | `AIDStore.checkAgentMd()` | `Promise<Result<AgentMdCheckData>>`(强类型) | `Promise<Result<Record<string, unknown>>>` |
65
- | 8 | `AIDStore.diagnose()` | `Promise<Result<DiagnoseData>>`(强类型) | `Promise<Result<Record<string, unknown>>>` |
66
- | 9 | `AIDStore.renewCert()` | `Promise<Result<{ renewed, newCertNotAfter }>>`(强类型) | `Promise<Result<Record<string, unknown>>>` |
67
- | 10 | `AIDStore.rekey()` | `Promise<Result<{ rekeyed, newFingerprint }>>`(强类型) | `Promise<Result<Record<string, unknown>>>` |
68
-
69
- **评估**:运行时数据可能是完整的,但 `.d.ts` 类型定义未细化。可能是:
70
- - 有意为之(避免频繁改类型定义)
71
- - 或 .d.ts 生成时未展开内部类型
72
-
73
- **建议**:确认运行时返回的实际字段是否与设计一致,如果一致则补充 `.d.ts` 类型。
74
-
75
- ---
76
-
77
- ### 2.3 AIDStore 额外内容
78
-
79
- | # | 差异 | 设计文档 | SDK 实际 |
80
- |---|------|---------|---------|
81
- | 11 | 构造参数 | 只有 `aunPath`, `encryptionSeed`, `deviceId?`, `slotId?` | 多了 `verifySsl?`, `discoveryPort?`, `rootCaPath?`, `debug?` |
82
- | 12 | `close()` 方法 | 未提及 | 存在 `close(): void` |
83
-
84
- **评估**:SDK 比设计多了运维/调试参数和资源清理方法,合理扩展。设计文档可补充。
85
-
86
- ---
87
-
88
- ### 2.4 AID 额外属性
89
-
90
- | # | 差异 | 设计文档 | SDK 实际 |
91
- |---|------|---------|---------|
92
- | 13 | `deviceId` / `slotId` | AID 无此属性 | `readonly deviceId: string` / `readonly slotId: string` |
93
-
94
- **评估**:AID 携带创建它的 store 的 deviceId/slotId,便于 AUNClient 使用。合理。
95
-
96
- ---
97
-
98
- ### 2.5 AIDInfo 额外字段
99
-
100
- | # | 差异 | 设计文档 | SDK 实际 |
101
- |---|------|---------|---------|
102
- | 14 | `AIDInfo` 字段 | `{ aid, certNotAfter, certIssuer }` | 多了 `certFingerprint: string` |
103
-
104
- **评估**:有用的额外信息,设计文档可补充。
105
-
106
- ---
107
-
108
- ### 2.6 AUNClient 构造与独立性
109
-
110
- | # | 差异 | 设计文档 | SDK 实际 |
111
- |---|------|---------|---------|
112
- | 15 | 构造签名 | `constructor(aid?: AID)` | `constructor(options?: AUNClientOptions)` 或 `constructor(aid: AID, options?: AUNClientOptions)` |
113
- | 16 | 独立使用 | 设计说配置由 AIDStore 管理,AUNClient 不接受配置 | `AUNClientOptions` 保留了 `aun_path`, `encryption_seed` 等,AUNClient 可独立使用 |
114
- | 17 | `setLocalAgentMdPath` | 设计说已移除 | 实际仍存在 `setLocalAgentMdPath(path): string` |
115
-
116
- **评估**:SDK 保留了向后兼容路径——不强制必须通过 AIDStore 使用 AUNClient。这是务实选择,但与设计文档"AUNClient 只接收 AID"的纯粹设计有偏差。
117
-
118
- ---
119
-
120
- ### 2.7 uploadAgentMd 可见性
121
-
122
- | # | 差异 | 设计文档 | SDK 实际 |
123
- |---|------|---------|---------|
124
- | 18 | `uploadAgentMd` | 公开方法,在 AUNClient 上 | **私有** `_uploadAgentMd`,仅 `publishAgentMd()` 公开 |
125
-
126
- **评估**:SDK 简化了公开 API——`publishAgentMd` 内部自动签名+上传,不再暴露裸上传。设计文档需更新。
127
-
128
- ---
129
-
130
- ### 2.8 authenticate 状态约束
131
-
132
- | # | 差异 | 设计文档 | SDK 实际 |
133
- |---|------|---------|---------|
134
- | 19 | `authenticate()` 可调状态 | 仅 Standby | Standby **和** Authenticated 都可调 |
135
-
136
- **评估**:SDK 允许在 Authenticated 状态重新认证(刷新 token),比设计宽松。合理。
137
-
138
- ---
139
-
140
- ### 2.9 connect() 参数
141
-
142
- | # | 差异 | 设计文档 | SDK 实际 |
143
- |---|------|---------|---------|
144
- | 20 | `connect()` 参数 | `{ gateway? }` | `connect(options?: RpcParams)` 接受任意 RPC 参数 |
145
-
146
- **评估**:更灵活,`gateway` 只是其中一个可选字段。
147
-
148
- ---
149
-
150
- ### 2.10 ConnectionState 命名风格
151
-
152
- | # | 差异 | 设计文档 | SDK 实际 |
153
- |---|------|---------|---------|
154
- | 21 | 枚举值命名 | kebab-case: `'no-identity'`, `'retry-backoff'` | snake_case: `'no_identity'`, `'retry_backoff'` |
155
-
156
- **评估**:设计文档需更新为 snake_case。
157
-
158
- ---
159
-
160
- ### 2.11 ResolveOpts 缺少 timeout
161
-
162
- | # | 差异 | 设计文档 | SDK 实际 |
163
- |---|------|---------|---------|
164
- | 22 | `ResolveOpts.timeout` | 有,默认 10000ms | 不存在,只有 `forceRefresh?` 和 `skipAgentMd?` |
165
-
166
- **评估**:SDK 未实现 timeout 参数。可能内部有默认超时,或后续版本补充。
167
-
168
- ---
169
-
170
- ## 三、总结
171
-
172
- ### 核心设计一致性:高
173
-
174
- 三主体架构、Result 统一错误处理、AID 不可变值对象、AUNClient 状态机、capability getters——这些核心设计全部落地,且实现质量高。
175
-
176
- ### 主要偏差分类
177
-
178
- | 类别 | 数量 | 严重程度 | 建议 |
179
- |------|:----:|:--------:|------|
180
- | 同步 vs 异步(设计写 Promise,实际同步) | 3 | 低 | 更新设计文档 |
181
- | 类型定义未细化(`Record<string, unknown>`) | 7 | 中 | 确认运行时字段,补充 .d.ts |
182
- | SDK 比设计多内容(额外参数/属性/方法) | 6 | 低 | 更新设计文档 |
183
- | AUNClient 独立性保留(未强制依赖 AIDStore) | 2 | 中 | 决策:是否在后续版本收紧 |
184
- | uploadAgentMd 变私有 | 1 | 低 | 更新设计文档 |
185
- | 命名风格(kebab vs snake) | 1 | 低 | 更新设计文档 |
186
- | ResolveOpts 缺 timeout | 1 | 低 | 后续版本补充或设计文档删除 |
187
-
188
- ### 建议优先级
189
-
190
- 1. **P0**:确认 `resolve` / `fetchAgentMd` 等方法运行时返回的实际字段,决定是否补充强类型
191
- 2. **P1**:更新设计文档中 `load()` / `list()` / `changeSeed()` 为同步签名
192
- 3. **P1**:更新 ConnectionState 枚举命名为 snake_case
193
- 4. **P2**:决定 AUNClient 独立使用路径是否保留(当前保留是合理的兼容策略)
194
- 5. **P2**:补充设计文档中缺失的 `AIDStore.close()`、额外构造参数、AID.deviceId/slotId