@agentunion/fastaun-browser 0.4.3 → 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 (71) hide show
  1. package/CHANGELOG.md +203 -178
  2. package/_packed_docs/CHANGELOG.md +203 -178
  3. package/_packed_docs/INDEX.md +17 -17
  4. package/_packed_docs/KITE_DOCS_GUIDE.md +11 -11
  5. package/_packed_docs/agent.md/SCHEMA.md +49 -49
  6. package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +22 -22
  7. 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 +327 -327
  8. package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +686 -686
  9. package/_packed_docs/design/2026-05-22-aun-rpc-trace-enhancement.md +542 -542
  10. package/_packed_docs/design/E2EE_V2/347/256/200/345/214/226/344/270/2721DH/345/212/240Per-AID_Wrap/346/226/271/346/241/210.md +124 -124
  11. package/_packed_docs/design//350/267/250/350/257/255/350/250/200/345/256/271/345/231/250E2E/346/265/213/350/257/225/346/226/271/346/241/210.md +665 -665
  12. package/_packed_docs/protocol/01-/350/272/253/344/273/275/344/270/216/345/207/255/350/257/201/345/215/217/350/256/256-auth.md +2 -2
  13. package/_packed_docs/protocol/14-/344/272/244/344/272/222/346/234/272/345/210/266-/345/223/215/345/272/224/346/250/241/345/274/217/344/270/216/350/207/252/344/270/273/346/250/241/345/274/217.md +170 -170
  14. package/_packed_docs/protocol/15-/347/246/273/347/272/277/346/216/250/351/200/201/351/200/232/347/237/245/345/215/217/350/256/256.md +419 -419
  15. package/_packed_docs/protocol/README.md +1 -1
  16. package/_packed_docs/protocol/aun-docs-guide.md +1 -1
  17. package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +15 -15
  18. package/_packed_docs/protocol//351/231/204/345/275/225B-/346/211/251/345/261/225/346/200/247/346/214/207/345/215/227.md +4 -4
  19. package/_packed_docs/protocol//351/231/204/345/275/225J-/345/256/242/346/210/267/347/253/257/346/216/245/345/205/245/347/244/272/344/276/213.md +98 -98
  20. package/_packed_docs/protocol//351/231/204/345/275/225M-JWT/350/256/244/350/257/201/345/256/236/347/216/260/346/214/207/345/215/227.md +46 -46
  21. package/_packed_docs/protocol//351/231/204/345/275/225N-/345/210/206/345/270/203/345/274/217Trace/345/215/217/350/256/256.md +257 -257
  22. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +1 -1
  23. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +1 -1
  24. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +1 -0
  25. package/_packed_docs/sdk/09-payload-reference.md +13 -13
  26. package/_packed_docs/sdk/E2EE_V2/346/266/210/346/201/257/351/200/232/344/277/241/346/227/266/345/272/217/345/233/276.md +171 -171
  27. package/dist/aid-store.d.ts +1 -0
  28. package/dist/aid-store.d.ts.map +1 -1
  29. package/dist/aid-store.js +26 -9
  30. package/dist/aid-store.js.map +1 -1
  31. package/dist/aid.d.ts +2 -1
  32. package/dist/aid.d.ts.map +1 -1
  33. package/dist/aid.js +7 -6
  34. package/dist/aid.js.map +1 -1
  35. package/dist/auth.d.ts +8 -13
  36. package/dist/auth.d.ts.map +1 -1
  37. package/dist/auth.js +38 -127
  38. package/dist/auth.js.map +1 -1
  39. package/dist/bundle.js +872 -350
  40. package/dist/client.d.ts +12 -5
  41. package/dist/client.d.ts.map +1 -1
  42. package/dist/client.js +296 -213
  43. package/dist/client.js.map +1 -1
  44. package/dist/index.d.ts +1 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/keystore/index.d.ts +45 -22
  49. package/dist/keystore/index.d.ts.map +1 -1
  50. package/dist/keystore/index.js +6 -1
  51. package/dist/keystore/index.js.map +1 -1
  52. package/dist/keystore/indexeddb.d.ts +11 -1
  53. package/dist/keystore/indexeddb.d.ts.map +1 -1
  54. package/dist/keystore/indexeddb.js +167 -18
  55. package/dist/keystore/indexeddb.js.map +1 -1
  56. package/dist/register-flow.d.ts +34 -0
  57. package/dist/register-flow.d.ts.map +1 -0
  58. package/dist/register-flow.js +355 -0
  59. package/dist/register-flow.js.map +1 -0
  60. package/dist/v2/session/keystore.d.ts +5 -0
  61. package/dist/v2/session/keystore.d.ts.map +1 -1
  62. package/dist/v2/session/keystore.js +29 -0
  63. package/dist/v2/session/keystore.js.map +1 -1
  64. package/dist/version.d.ts +1 -1
  65. package/dist/version.js +1 -1
  66. package/package.json +1 -1
  67. 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
  68. 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
  69. 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
  70. 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 -1697
  71. package/_packed_docs/python-sdk-v2-only-changelog.md +0 -189
@@ -1,178 +1,203 @@
1
- # Changelog
2
-
3
- 本文件记录 `@agentunion/fastaun-browser` SDK 的版本变更。最新版本在最前面。
4
-
5
- 格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/);版本号遵循 [SemVer](https://semver.org/lang/zh-CN/)。
6
-
7
- ---
8
-
9
- ## 0.4.3 — 2026-05-31
10
-
11
- ### Added
12
- - **`normalizeSlotId` / `slotIsolationKey`**:新增 slot_id 校验与隔离键提取工具函数,支持 `/` `:` 空格作为分隔符(首字符不允许)。
13
- - **`ConnectOptions` 新增字段**:`connection_kind`、`short_ttl_ms`、`delivery_mode`、`extra_info`、`background_sync`,与 Python / Go / TS SDK 对齐。
14
-
15
- ### Changed
16
- - **`AUNClient` 构造**:传入 `aid` 参数时增加类型守卫(检查 `aunPath` 字段与 `isPrivateKeyValid` 方法),避免误传非 AID 对象。
17
- - **slot_id 隔离逻辑**:`connect` 时若目标 slot_id 隔离键与当前不同,自动拒绝跨 slot 连接。
18
- - **`background_sync` 触发时机**:连接成功后仅在 `sessionOptions.background_sync !== false` 时触发 P2P gap fill。
19
- - **`verify_ssl=false` 浏览器警告**:浏览器环境不支持关闭 SSL 校验,传入时输出 warn 并强制保持启用。
20
-
21
- ---
22
-
23
- ## 0.4.2 — 2026-05-30
24
-
25
- ### Added
26
- - **`AIDStore` 新增具名返回类型**:`ResolveResult`、`FetchAgentMdResult`、`HeadAgentMdResult`、`CheckAgentMdResult`、`DiagnoseResult`、`RenewCertResult`、`RekeyResult`、`ChangeSeedResult`、`ListResult`,替代原来的 `Record<string, unknown>`。
27
-
28
- ### Changed
29
- - **移除 `discoveryPort`**:`AIDStore` 构造选项删除 `discoveryPort`,gateway URL 改为纯自动发现。
30
- - **`fetchAgentMd` 新增 `timeoutMs` 参数**(默认 30000ms),`resolve` 内部调用时透传 `opts.timeout`。
31
- - **返回字段精简**:`fetchAgentMd` / `headAgentMd` / `checkAgentMd` / `diagnose` 移除冗余的 camelCase 别名字段,统一使用 snake_case。
32
- - **`resolve` 返回 `source` 字段精简**:移除 `certFromCache` / `agentMdFetched` camelCase 别名,只保留 `cert_from_cache` / `agent_md_fetched`。
33
-
34
- ---
35
-
36
- ## 0.4.0 — 2026-05-30
37
-
38
- > **破坏性重构版本。** Python SDK 0.4.0 对齐:身份管理剥离为 `AID` / `AIDStore`;删除 `auth` / `custody` / `meta` 公开命名空间;引入 `Result` 与字符串错误码;连接状态机扩展为 9 态。浏览器环境下 `AID` 创建和签名/验证均为异步。
39
-
40
- ### Breaking Changes
41
- - **删除公开命名空间**:移除 `client.auth` / `client.custody` / `client.meta`。身份相关功能迁移到 `AIDStore` `AID`,其余 RPC 走 `client.call()`。
42
- - **`AID` 创建改为异步**:使用 `await AID.create(...)` 工厂方法(浏览器 Web Crypto API 限制);`sign` / `verify` / `signAgentMd` / `verifyAgentMd` 均为 `async`。
43
- - **目录约定变更**:`{aun_path}/AgentMDs/` `{aun_path}/AIDs/`(IndexedDB key 前缀同步变更)。
44
-
45
- ### Added
46
- - **`AID` 类**(异步):`AID.create()` 工厂方法;`sign` / `verify` / `signAgentMd` / `verifyAgentMd` 均返回 Promise;`isCertValid` / `isPrivateKeyValid` 同步。
47
- - **`AIDStore` 类**:离线 `load` / `list` / `exists`,联网 `register` / `resolve` / `fetchAgentMd` / `checkAgentMd` / `diagnose` / `renewCert` / `rekey` / `changeSeed`;存储后端为 IndexedDB。
48
- - **`Result<T>` 类型**:统一结果类型(`{ ok: true; data: T }` 或 `{ ok: false; error: ErrorInfo }`)。
49
- - **新增错误类**:`NotFoundError` / `IdentityConflictError` / `E2EEGroupSecretMissingError` / `E2EEGroupEpochMismatchError`。
50
- - **`ConnectionState` 枚举**:9 态(`NO_IDENTITY` / `STANDBY` / `CONNECTING` / `READY` / `RETRY_BACKOFF` / `RECONNECTING` / `CONNECTION_FAILED` / `CLOSED`)。
51
- - **实例级 `protected_headers`**:`setProtectedHeaders()` 自动合并到 `message.send` / `group.send` / `*.thought.put`。
52
- - **重连状态可观测**:`nextRetryAt` / `retryAttempt` / `retryMaxAttempts` / `lastError` / `lastErrorCode` 属性。
53
- - **导出**:`__version__` 常量、`STATE_TO_PUBLIC` 映射表、`ROOT_CA_PEM` 根证书。
54
-
55
- ### Removed
56
- - 删除 `js/src/namespaces/auth.ts`、`js/src/namespaces/custody.ts`、`js/src/namespaces/meta.ts`。
57
-
58
- ---
59
-
60
- ## 0.3.6 — 2026-05-28
61
-
62
- ### Added
63
- - **Encrypted push 解密管线**:收到加密推送时即时尝试 V2 解密,成功则发 `message.received` / `group.message_created`(含明文 payload + e2ee 元数据),失败则发 `message.undecryptable` / `group.message_undecryptable`(含诊断字段 `_decrypt_error` / `_decrypt_stage` / `_envelope_type`)
64
- - **`auth.fetchPeerCert(gatewayUrl, aid)`**:公开 API 实现落地(v0.3.5 声明,v0.3.6 实现独立方法体)
65
- - **`storage.get_limits` RPC**:查询上传限制和配额使用情况
66
- - **`storage.check_upload` RPC**:上传预检(秒传检测 + 超限检测)
67
-
68
- ### Fixed
69
- - **Identity cache 自愈**:V2 session init 时检测 `private_key_pem` 缺失,自动从 keystore 重新加载并清理脏 instance_state
70
- - **`loadIdentity` 字段白名单**:只合并 `_INSTANCE_STATE_FIELDS` 定义的字段,防止 instance_state 表中的脏数据覆盖核心字段
71
-
72
- ---
73
-
74
- ## 0.3.5 2026-05-28
75
-
76
- ### Breaking Changes
77
- - **`createAid()` `registerAid()`**:客户端 API 重命名,旧方法已移除
78
- - **注册与认证分离**:`authenticate()` 不再隐式注册;身份不完整时抛 `StateError`
79
-
80
- ### Added
81
- - **`IdentityConflictError`**:新增错误类型(继承 `AuthError`),AID 注册冲突时抛出
82
- - **`auth.loadIdentity()` / `auth.loadIdentityOrNull()`**:公开 API,只读加载本地已注册身份(密钥对 + 证书 + 实例状态),无副作用
83
- - **`auth.fetchPeerCert()`**:公开 API,获取对端 AID 证书 PEM(本地缓存优先,未命中走 PKI HTTP + 链验证)
84
- - **Pull Gate**:per-key 序列化 pull 操作,防止同一 namespace 并发 pull
85
- - **RPC Inflight 限制**:transport 层全局最大 16 个并发 RPC + 后台 RPC 独立限制 8 个,排队超时抛 `TimeoutError`
86
- - **`_assertCertMatchesLocalKeypair`**:authenticate 前显式校验 cert 公钥与本地 keypair 一致
87
- - **`_downloadRegisteredCert`**:注册前查服务端证书的辅助方法
88
-
89
- ### Changed
90
- - **`registerAid` 半成品恢复**:本地有 keypair 无 cert 时,查服务端恢复;服务端无记录则用现有 keypair 注册
91
- - **agent.md 元数据存储**:从全局 `list.json` key 改为 per-AID `{aid}/agentmd.json` key(IndexedDB)
92
- - **agent.md 下载**:改为无条件 GET;302 显式跟随;304 时本地有缓存直接用,无缓存重试
93
- - **`_loadIdentityOrRaise`**:增加 keypair 完整性检查
94
- - **`ChangeSeed` API**:`IndexedDBKeyStore.changeSeed()` 支持更换 seed(重加密私钥)
95
-
96
- ### Removed
97
- - **`_ensureLocalIdentity` / `_ensureIdentity`**:已移除,注册路径不再隐式生成密钥
98
- - **`createAid` 方法**:已移除
99
-
100
- ---
101
-
102
- ## 0.3.3 2026-05-25
103
-
104
- ### Added
105
- - **V2 Thought 加解密**:`group.thought.get` / `message.thought.get` 返回值自动解密;发送端自动加密;`attachV2EnvelopeMetadata` 附加 E2EE 元数据
106
- - **V2 Sender IK 延迟解密**:`_v2SenderIKPending` / `_v2SenderIKFetching` 机制,对端 IK 未缓存时挂起消息、异步拉取后重试解密
107
- - **agent.md 本地缓存体系(浏览器版本)**:`publishAgentMd(content?)` / `fetchAgentMd(aid?)`;基于 IndexedDB/localStorage 的 list + AID 存储 + etag 比对 + 自动拉取缺失
108
- - **V2 辅助函数**:`getV2DeviceId` / `_v2B64ToBytesStrict` / `_v2BytesEqual` / `_v2ConcatBytes` / `_v2LengthPrefixedTextKey` / `_v2LengthPrefixedBytes`
109
- - **V2 envelope 元数据**:`attachV2EnvelopeMetadata` / `attachV2EnvelopeMetadataFromSource` / `extractV2EnvelopeFromSource` / `metadataWithoutAuth`
110
-
111
- ### Changed
112
- - **V2 消息处理路径重构**:统一 P2P/Group 解密入口,支持 sender IK pending 延迟模式
113
- - **V2 SPK rotation**:thought 解密失败时触发 group SPK rotation / registration after peer fallback
114
-
115
- ### Fixed
116
- - **service-plane envelope 解包**:修复 Kernel trace 字段传递丢失
117
- - **trace 树状展示**:enter/exit 配对 + 嵌套缩进
118
-
119
- ---
120
-
121
- ## 0.3.1 — 2026-05-22
122
-
123
- ### Added
124
- - **`auth.checkAid` handler**:本地证书自检 + 远端注册状态查询(与 Node 版对齐)
125
- - **RPC trace 增强(浏览器版本)**:`RPCTransport` 增加 `setTraceMode()` / `setTraceObserver()`;`sortTraceSpansForDisplay` / `formatTraceTree` / `traceDisplay` 树状展示
126
- - **V2 群组 SPK 生命周期**:`V2KeyStore.saveGroupSPK` / `loadGroupSPK` / `loadCurrentGroupSPK` 基于 IndexedDB 持久化;`V2Session.ensureGroupSPK` / `ensureGroupRegistered` / `rotateGroupSPK` / `getGroupDecryptKeys`;`DESTROY_DELAY_MS = 7d`
127
- - **V2 P2P push 解密**:`AUNClient` 增加 push payload 就地解密路径,失败回退到 pull
128
-
129
- ### Changed
130
- - **`SeqTracker.forceContiguousSeq`**:原 `contiguousSeq = minSeq` 跳过空洞(会丢消息),改为 `contiguousSeq = minSeq - 1` 由连续前缀自然推进
131
-
132
- ### Fixed
133
- - short RPC 请求增加 `debug` 完整报文日志,便于跨语言诊断
134
-
135
- ---
136
-
137
- ## 0.3.0 2026-05-21 ⚠️ BREAKING CHANGE
138
-
139
- > **V2-only 版本**:移除全部 V1 E2EE(含群组加密),新增 V2 加密原语,API 不向后兼容。
140
-
141
- ### BREAKING
142
- - **移除 V1 E2EE 全部实现**:`e2ee-group.ts`、V1 epoch key 逻辑全部删除
143
- - **移除 V1 群组加密测试**:`e2ee.spec.ts`、`epoch-key-server.spec.ts`、`group-e2ee.spec.ts`、`group-join-key-recovery.spec.ts` 等
144
- - **E2EE 接口简化**:`e2ee.ts` 仅保留 V2 路径,V1 加解密方法不再可用
145
- - **配置变更**:`config.ts` 移除 V1 相关配置项
146
-
147
- ### Added
148
- - **agent.md 主 API(浏览器版本)**:`AUNClient.publishAgentMd(content)` / `AUNClient.fetchAgentMd(aid?)`
149
- - **V2 加密原语**(跨语言 golden vector 一致性):ECDH P-256、HKDF-SHA256、AES-256-GCM、ECDSA-SHA256 RAW、1DH/3DH wrap_key、Recipients Sort + Merkle Digest、State Commitment
150
- - **V2 Session**:SPK 生命周期 + 对端 IK 缓存 + PFS 三重销毁
151
- - **V2 KeyStore**:IndexedDB 持久化 SPK/IK 异步实现
152
-
153
- ### Removed
154
- - `AUNClient.setLocalAgentMdContent()` / `getLocalAgentMdEtag()` / `getRemoteAgentMdEtag()` — 由主 API 自动维护
155
-
156
- ### Deprecated
157
- - `client.auth.signAgentMd` / `verifyAgentMd` / `uploadAgentMd` / `downloadAgentMd` — 建议迁移到 `client.publishAgentMd` / `client.fetchAgentMd`
158
-
159
- ---
160
-
161
- ## 0.2.20 — 2026-05-18
162
-
163
- ### Added
164
- - **agent.md 版本一致性 API(浏览器版本)**:
165
- - `AUNClient.setLocalAgentMdContent(content: string): Promise<string>`:浏览器无法读本地文件,改为接收 markdown 文本字符串,用 `crypto.subtle.digest('SHA-256', ...)` 计算 etag。业务侧可用 `<input type=file>` 读出文本传入。
166
- - `AUNClient.getLocalAgentMdEtag(): string` / `getRemoteAgentMdEtag(): string`。
167
- - SDK 自动从 RPC envelope `_meta.agent_md_etag` 提取服务端 etag,应用层订阅 `message.received` / `group.message_created` 等事件时 payload 多 `_agent_md.{local_etag, remote_etag}` 字段供版本比对。
168
- - **`downloadAgentMd` 条件请求缓存**:内部维护 ETag/Last-Modified,未变化时返回上次缓存内容;外部 API 形态不变。
169
- - **transport meta observer**:`RPCTransport.setMetaObserver(fn)` 透传 envelope `_meta`,observer 抛错被吞,不影响 RPC result。
170
-
171
- ### Changed
172
- - **RPC call 默认超时 10s → 35s**:与服务端 30s handler timeout 对齐,留 5s buffer。
173
- - **multi-device 架构**:对端无 prekey `_sendEncrypted` 直接抛错(`no registered device prekeys for ...`),不再降级到 `long_term_key`。
174
-
175
- ### Docs
176
- - 仓库根 `docs/`(agent.md 规范、protocol、SDK 手册)随 npm tarball 打包到 `_packed_docs/`,安装后可读。`.gitignore` 排除项(如内部测试指南)不进包。
177
-
178
- ---
1
+ # Changelog
2
+
3
+ 本文件记录 `@agentunion/fastaun-browser` SDK 的版本变更。最新版本在最前面。
4
+
5
+ 格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/);版本号遵循 [SemVer](https://semver.org/lang/zh-CN/)。
6
+
7
+ ---
8
+
9
+ ## 0.4.5 — 2026-05-31
10
+
11
+ ### Added
12
+ - **`RegisterFlow` 独立类**(`register-flow.ts`):将 AID 注册流程从 `AuthFlow` 中剥离,负责 keypair 生成、服务端 RPC、pending 目录(IndexedDB)原子提交、崩溃恢复。
13
+ - **`TokenStore` 接口**:从 `KeyStore` 中拆分出不含私钥操作的子接口,供 `AuthFlow` 使用。
14
+
15
+ ### Changed
16
+ - **`AuthFlow` 改用 `TokenStore`**:构造参数 `keystore` 重命名为 `tokenStore`,类型收窄为 `TokenStore`;私钥操作全部移出 `AuthFlow`。
17
+ - **`AuthFlow.setIdentity()`**:新增方法,由 `AUNClient` 注入内存私钥;`AuthFlow` 内部不再从 `tokenStore` 解密私钥。
18
+ - **`AIDStore.register()` 私钥写入职责转移**:注册结果由 `AIDStore` 负责调用 `keystore.saveCert` / `saveKeyPair` 写入,与 Python / Go / TS SDK 对齐。
19
+
20
+ ---
21
+
22
+ ## 0.4.4 — 2026-05-31
23
+
24
+ ### Added
25
+ - **`AID` 新增 `privateKeyPem` 只读字段**:`AIDStore.load()` 加载时注入明文私钥,`AUNClient` 直接从 `AID` 读取,无需再经 keystore 解密。
26
+
27
+ ### Changed
28
+ - **`AUNClient` 剥离私钥读写**:V2 session 初始化、`_signClientOperation`、propose_state 签名均改从 `_currentAid.privateKeyPem` 读取,删除 keystore fallback 重解密路径。
29
+ - **`auth._persistIdentity` 不再写私钥**:写入前剥离 `private_key_pem` / `public_key_der_b64` / `curve`,AUNClient keystore 只持久化 token / cert / instance_state。
30
+ - **`AUNClient` keystore 构造不再传 `encryptionSeed`**:seed 作用域收窄至 AIDStore,不外漏。
31
+
32
+ ---
33
+
34
+ ## 0.4.3 — 2026-05-31
35
+
36
+ ### Added
37
+ - **`normalizeSlotId` / `slotIsolationKey`**:新增 slot_id 校验与隔离键提取工具函数,支持 `/` `:` 空格作为分隔符(首字符不允许)。
38
+ - **`ConnectOptions` 新增字段**:`connection_kind`、`short_ttl_ms`、`delivery_mode`、`extra_info`、`background_sync`,与 Python / Go / TS SDK 对齐。
39
+
40
+ ### Changed
41
+ - **`AUNClient` 构造**:传入 `aid` 参数时增加类型守卫(检查 `aunPath` 字段与 `isPrivateKeyValid` 方法),避免误传非 AID 对象。
42
+ - **slot_id 隔离逻辑**:`connect` 时若目标 slot_id 隔离键与当前不同,自动拒绝跨 slot 连接。
43
+ - **`background_sync` 触发时机**:连接成功后仅在 `sessionOptions.background_sync !== false` 时触发 P2P gap fill。
44
+ - **`verify_ssl=false` 浏览器警告**:浏览器环境不支持关闭 SSL 校验,传入时输出 warn 并强制保持启用。
45
+
46
+ ---
47
+
48
+ ## 0.4.2 2026-05-30
49
+
50
+ ### Added
51
+ - **`AIDStore` 新增具名返回类型**:`ResolveResult`、`FetchAgentMdResult`、`HeadAgentMdResult`、`CheckAgentMdResult`、`DiagnoseResult`、`RenewCertResult`、`RekeyResult`、`ChangeSeedResult`、`ListResult`,替代原来的 `Record<string, unknown>`。
52
+
53
+ ### Changed
54
+ - **移除 `discoveryPort`**:`AIDStore` 构造选项删除 `discoveryPort`,gateway URL 改为纯自动发现。
55
+ - **`fetchAgentMd` 新增 `timeoutMs` 参数**(默认 30000ms),`resolve` 内部调用时透传 `opts.timeout`。
56
+ - **返回字段精简**:`fetchAgentMd` / `headAgentMd` / `checkAgentMd` / `diagnose` 移除冗余的 camelCase 别名字段,统一使用 snake_case。
57
+ - **`resolve` 返回 `source` 字段精简**:移除 `certFromCache` / `agentMdFetched` camelCase 别名,只保留 `cert_from_cache` / `agent_md_fetched`。
58
+
59
+ ---
60
+
61
+ ## 0.4.0 — 2026-05-30
62
+
63
+ > **破坏性重构版本。** Python SDK 0.4.0 对齐:身份管理剥离为 `AID` / `AIDStore`;删除 `auth` / `custody` / `meta` 公开命名空间;引入 `Result` 与字符串错误码;连接状态机扩展为 9 态。浏览器环境下 `AID` 创建和签名/验证均为异步。
64
+
65
+ ### Breaking Changes
66
+ - **删除公开命名空间**:移除 `client.auth` / `client.custody` / `client.meta`。身份相关功能迁移到 `AIDStore` 与 `AID`,其余 RPC `client.call()`。
67
+ - **`AID` 创建改为异步**:使用 `await AID.create(...)` 工厂方法(浏览器 Web Crypto API 限制);`sign` / `verify` / `signAgentMd` / `verifyAgentMd` 均为 `async`。
68
+ - **目录约定变更**:`{aun_path}/AgentMDs/` → `{aun_path}/AIDs/`(IndexedDB key 前缀同步变更)。
69
+
70
+ ### Added
71
+ - **`AID` 类**(异步):`AID.create()` 工厂方法;`sign` / `verify` / `signAgentMd` / `verifyAgentMd` 均返回 Promise;`isCertValid` / `isPrivateKeyValid` 同步。
72
+ - **`AIDStore` 类**:离线 `load` / `list` / `exists`,联网 `register` / `resolve` / `fetchAgentMd` / `checkAgentMd` / `diagnose` / `renewCert` / `rekey` / `changeSeed`;存储后端为 IndexedDB。
73
+ - **`Result<T>` 类型**:统一结果类型(`{ ok: true; data: T }` 或 `{ ok: false; error: ErrorInfo }`)。
74
+ - **新增错误类**:`NotFoundError` / `IdentityConflictError` / `E2EEGroupSecretMissingError` / `E2EEGroupEpochMismatchError`。
75
+ - **`ConnectionState` 枚举**:9 态(`NO_IDENTITY` / `STANDBY` / `CONNECTING` / `READY` / `RETRY_BACKOFF` / `RECONNECTING` / `CONNECTION_FAILED` / `CLOSED`)。
76
+ - **实例级 `protected_headers`**:`setProtectedHeaders()` 自动合并到 `message.send` / `group.send` / `*.thought.put`。
77
+ - **重连状态可观测**:`nextRetryAt` / `retryAttempt` / `retryMaxAttempts` / `lastError` / `lastErrorCode` 属性。
78
+ - **导出**:`__version__` 常量、`STATE_TO_PUBLIC` 映射表、`ROOT_CA_PEM` 根证书。
79
+
80
+ ### Removed
81
+ - 删除 `js/src/namespaces/auth.ts`、`js/src/namespaces/custody.ts`、`js/src/namespaces/meta.ts`。
82
+
83
+ ---
84
+
85
+ ## 0.3.6 2026-05-28
86
+
87
+ ### Added
88
+ - **Encrypted push 解密管线**:收到加密推送时即时尝试 V2 解密,成功则发 `message.received` / `group.message_created`(含明文 payload + e2ee 元数据),失败则发 `message.undecryptable` / `group.message_undecryptable`(含诊断字段 `_decrypt_error` / `_decrypt_stage` / `_envelope_type`)
89
+ - **`auth.fetchPeerCert(gatewayUrl, aid)`**:公开 API 实现落地(v0.3.5 声明,v0.3.6 实现独立方法体)
90
+ - **`storage.get_limits` RPC**:查询上传限制和配额使用情况
91
+ - **`storage.check_upload` RPC**:上传预检(秒传检测 + 超限检测)
92
+
93
+ ### Fixed
94
+ - **Identity cache 自愈**:V2 session init 时检测 `private_key_pem` 缺失,自动从 keystore 重新加载并清理脏 instance_state
95
+ - **`loadIdentity` 字段白名单**:只合并 `_INSTANCE_STATE_FIELDS` 定义的字段,防止 instance_state 表中的脏数据覆盖核心字段
96
+
97
+ ---
98
+
99
+ ## 0.3.5 — 2026-05-28
100
+
101
+ ### Breaking Changes
102
+ - **`createAid()` `registerAid()`**:客户端 API 重命名,旧方法已移除
103
+ - **注册与认证分离**:`authenticate()` 不再隐式注册;身份不完整时抛 `StateError`
104
+
105
+ ### Added
106
+ - **`IdentityConflictError`**:新增错误类型(继承 `AuthError`),AID 注册冲突时抛出
107
+ - **`auth.loadIdentity()` / `auth.loadIdentityOrNull()`**:公开 API,只读加载本地已注册身份(密钥对 + 证书 + 实例状态),无副作用
108
+ - **`auth.fetchPeerCert()`**:公开 API,获取对端 AID 证书 PEM(本地缓存优先,未命中走 PKI HTTP + 链验证)
109
+ - **Pull Gate**:per-key 序列化 pull 操作,防止同一 namespace 并发 pull
110
+ - **RPC Inflight 限制**:transport 层全局最大 16 个并发 RPC + 后台 RPC 独立限制 8 个,排队超时抛 `TimeoutError`
111
+ - **`_assertCertMatchesLocalKeypair`**:authenticate 前显式校验 cert 公钥与本地 keypair 一致
112
+ - **`_downloadRegisteredCert`**:注册前查服务端证书的辅助方法
113
+
114
+ ### Changed
115
+ - **`registerAid` 半成品恢复**:本地有 keypair 无 cert 时,查服务端恢复;服务端无记录则用现有 keypair 注册
116
+ - **agent.md 元数据存储**:从全局 `list.json` key 改为 per-AID `{aid}/agentmd.json` key(IndexedDB)
117
+ - **agent.md 下载**:改为无条件 GET;302 显式跟随;304 时本地有缓存直接用,无缓存重试
118
+ - **`_loadIdentityOrRaise`**:增加 keypair 完整性检查
119
+ - **`ChangeSeed` API**:`IndexedDBKeyStore.changeSeed()` 支持更换 seed(重加密私钥)
120
+
121
+ ### Removed
122
+ - **`_ensureLocalIdentity` / `_ensureIdentity`**:已移除,注册路径不再隐式生成密钥
123
+ - **`createAid` 方法**:已移除
124
+
125
+ ---
126
+
127
+ ## 0.3.3 2026-05-25
128
+
129
+ ### Added
130
+ - **V2 Thought 加解密**:`group.thought.get` / `message.thought.get` 返回值自动解密;发送端自动加密;`attachV2EnvelopeMetadata` 附加 E2EE 元数据
131
+ - **V2 Sender IK 延迟解密**:`_v2SenderIKPending` / `_v2SenderIKFetching` 机制,对端 IK 未缓存时挂起消息、异步拉取后重试解密
132
+ - **agent.md 本地缓存体系(浏览器版本)**:`publishAgentMd(content?)` / `fetchAgentMd(aid?)`;基于 IndexedDB/localStorage 的 list + 按 AID 存储 + etag 比对 + 自动拉取缺失
133
+ - **V2 辅助函数**:`getV2DeviceId` / `_v2B64ToBytesStrict` / `_v2BytesEqual` / `_v2ConcatBytes` / `_v2LengthPrefixedTextKey` / `_v2LengthPrefixedBytes`
134
+ - **V2 envelope 元数据**:`attachV2EnvelopeMetadata` / `attachV2EnvelopeMetadataFromSource` / `extractV2EnvelopeFromSource` / `metadataWithoutAuth`
135
+
136
+ ### Changed
137
+ - **V2 消息处理路径重构**:统一 P2P/Group 解密入口,支持 sender IK pending 延迟模式
138
+ - **V2 SPK rotation**:thought 解密失败时触发 group SPK rotation / registration after peer fallback
139
+
140
+ ### Fixed
141
+ - **service-plane envelope 解包**:修复 Kernel trace 字段传递丢失
142
+ - **trace 树状展示**:enter/exit 配对 + 嵌套缩进
143
+
144
+ ---
145
+
146
+ ## 0.3.1 — 2026-05-22
147
+
148
+ ### Added
149
+ - **`auth.checkAid` handler**:本地证书自检 + 远端注册状态查询(与 Node 版对齐)
150
+ - **RPC trace 增强(浏览器版本)**:`RPCTransport` 增加 `setTraceMode()` / `setTraceObserver()`;`sortTraceSpansForDisplay` / `formatTraceTree` / `traceDisplay` 树状展示
151
+ - **V2 群组 SPK 生命周期**:`V2KeyStore.saveGroupSPK` / `loadGroupSPK` / `loadCurrentGroupSPK` 基于 IndexedDB 持久化;`V2Session.ensureGroupSPK` / `ensureGroupRegistered` / `rotateGroupSPK` / `getGroupDecryptKeys`;`DESTROY_DELAY_MS = 7d`
152
+ - **V2 P2P push 解密**:`AUNClient` 增加 push payload 就地解密路径,失败回退到 pull
153
+
154
+ ### Changed
155
+ - **`SeqTracker.forceContiguousSeq`**:原 `contiguousSeq = minSeq` 跳过空洞(会丢消息),改为 `contiguousSeq = minSeq - 1` 由连续前缀自然推进
156
+
157
+ ### Fixed
158
+ - short RPC 请求增加 `debug` 完整报文日志,便于跨语言诊断
159
+
160
+ ---
161
+
162
+ ## 0.3.0 — 2026-05-21 ⚠️ BREAKING CHANGE
163
+
164
+ > **V2-only 版本**:移除全部 V1 E2EE(含群组加密),新增 V2 加密原语,API 不向后兼容。
165
+
166
+ ### BREAKING
167
+ - **移除 V1 E2EE 全部实现**:`e2ee-group.ts`、V1 epoch key 逻辑全部删除
168
+ - **移除 V1 群组加密测试**:`e2ee.spec.ts`、`epoch-key-server.spec.ts`、`group-e2ee.spec.ts`、`group-join-key-recovery.spec.ts`
169
+ - **E2EE 接口简化**:`e2ee.ts` 仅保留 V2 路径,V1 加解密方法不再可用
170
+ - **配置变更**:`config.ts` 移除 V1 相关配置项
171
+
172
+ ### Added
173
+ - **agent.md API(浏览器版本)**:`AUNClient.publishAgentMd(content)` / `AUNClient.fetchAgentMd(aid?)`
174
+ - **V2 加密原语**(跨语言 golden vector 一致性):ECDH P-256、HKDF-SHA256、AES-256-GCM、ECDSA-SHA256 RAW、1DH/3DH wrap_key、Recipients Sort + Merkle Digest、State Commitment
175
+ - **V2 Session**:SPK 生命周期 + 对端 IK 缓存 + PFS 三重销毁
176
+ - **V2 KeyStore**:IndexedDB 持久化 SPK/IK 异步实现
177
+
178
+ ### Removed
179
+ - `AUNClient.setLocalAgentMdContent()` / `getLocalAgentMdEtag()` / `getRemoteAgentMdEtag()` — 由主 API 自动维护
180
+
181
+ ### Deprecated
182
+ - `client.auth.signAgentMd` / `verifyAgentMd` / `uploadAgentMd` / `downloadAgentMd` — 建议迁移到 `client.publishAgentMd` / `client.fetchAgentMd`
183
+
184
+ ---
185
+
186
+ ## 0.2.20 — 2026-05-18
187
+
188
+ ### Added
189
+ - **agent.md 版本一致性 API(浏览器版本)**:
190
+ - `AUNClient.setLocalAgentMdContent(content: string): Promise<string>`:浏览器无法读本地文件,改为接收 markdown 文本字符串,用 `crypto.subtle.digest('SHA-256', ...)` 计算 etag。业务侧可用 `<input type=file>` 读出文本传入。
191
+ - `AUNClient.getLocalAgentMdEtag(): string` / `getRemoteAgentMdEtag(): string`。
192
+ - SDK 自动从 RPC envelope `_meta.agent_md_etag` 提取服务端 etag,应用层订阅 `message.received` / `group.message_created` 等事件时 payload 多 `_agent_md.{local_etag, remote_etag}` 字段供版本比对。
193
+ - **`downloadAgentMd` 条件请求缓存**:内部维护 ETag/Last-Modified,未变化时返回上次缓存内容;外部 API 形态不变。
194
+ - **transport meta observer**:`RPCTransport.setMetaObserver(fn)` 透传 envelope `_meta`,observer 抛错被吞,不影响 RPC result。
195
+
196
+ ### Changed
197
+ - **RPC call 默认超时 10s → 35s**:与服务端 30s handler timeout 对齐,留 5s buffer。
198
+ - **multi-device 架构**:对端无 prekey 时 `_sendEncrypted` 直接抛错(`no registered device prekeys for ...`),不再降级到 `long_term_key`。
199
+
200
+ ### Docs
201
+ - 仓库根 `docs/`(agent.md 规范、protocol、SDK 手册)随 npm tarball 打包到 `_packed_docs/`,安装后可读。`.gitignore` 排除项(如内部测试指南)不进包。
202
+
203
+ ---
@@ -8,9 +8,9 @@
8
8
 
9
9
  | 文档 | 定位 |
10
10
  | --- | --- |
11
- | [aun测试运行指南](aun测试运行指南.md) | 当前 Docker 单域、双域、多语言 SDK 测试运行命令 |
12
- | [AUN SDK 重构修改清单](AUN_SDK_重构修改清单.md) | 本轮 SDK 重构的实际修改点、测试结果和遗留事项 |
13
- | [跨语言容器E2E测试方案](design/跨语言容器E2E测试方案.md) | 多语言 SDK 同网同服、test-runner 控制面的跨语言 E2E 方案 |
11
+ | [aun测试运行指南](aun测试运行指南.md) | 当前 Docker 单域、双域、多语言 SDK 测试运行命令 |
12
+ | [AUN SDK 重构修改清单](AUN_SDK_重构修改清单.md) | 本轮 SDK 重构的实际修改点、测试结果和遗留事项 |
13
+ | [跨语言容器E2E测试方案](design/跨语言容器E2E测试方案.md) | 多语言 SDK 同网同服、test-runner 控制面的跨语言 E2E 方案 |
14
14
  | [E2EE V2 简化为 1DH + Per-AID Wrap 方案](design/E2EE_V2简化为1DH加Per-AID_Wrap方案.md) | SDK bootstrap 能力声明 + 服务端 policy 控制 1DH/per-AID wrap 的兼容方案 |
15
15
  | [AUN RPC Trace 增强设计](design/2026-05-22-aun-rpc-trace-enhancement.md) | RPC trace 诊断字段与 enter/exit span 设计 |
16
16
  | [远程 agent.md 缓存与 ETag 透传方案](agent.md/远程agent.md缓存与etag透传方案.md) | 远程 agent.md per-AID 缓存、SQLite 表、消息信封与 RPC 响应 ETag 透传方案 |
@@ -26,9 +26,9 @@
26
26
 
27
27
  ### 测试与 E2E
28
28
 
29
- - 现有测试命令、容器名、单域/双域运行入口 → [aun测试运行指南](aun测试运行指南.md)
30
- - 本轮 SDK 重构阶段进度、修改点和测试结果 → [AUN SDK 重构修改清单](AUN_SDK_重构修改清单.md)
31
- - Python / TypeScript / Go / C++ 跨语言容器 E2E、test-runner、test-control API、用例矩阵 → [aun测试运行指南](aun测试运行指南.md)、[跨语言容器E2E测试方案](design/跨语言容器E2E测试方案.md)
29
+ - 现有测试命令、容器名、单域/双域运行入口 → [aun测试运行指南](aun测试运行指南.md)
30
+ - 本轮 SDK 重构阶段进度、修改点和测试结果 → [AUN SDK 重构修改清单](AUN_SDK_重构修改清单.md)
31
+ - Python / TypeScript / Go / C++ 跨语言容器 E2E、test-runner、test-control API、用例矩阵 → [aun测试运行指南](aun测试运行指南.md)、[跨语言容器E2E测试方案](design/跨语言容器E2E测试方案.md)
32
32
  - 多语言 SDK 测试缺口与补测清单 → [审查与路线图目录](audit/)
33
33
 
34
34
  ### SDK 使用与协议
@@ -54,17 +54,17 @@
54
54
 
55
55
  ## Layer 3:重点文档摘要
56
56
 
57
- ### aun测试运行指南
58
-
59
- 记录当前 AUN 服务与 SDK 在 Docker 单域、双域环境中的实际测试入口。包含 Python、TypeScript、Go、JavaScript、C++ 五语言测试矩阵,Python / TypeScript / Go / C++ 跨语言容器 E2E 的 69 用例矩阵,覆盖 P2P 明文/E2EE、群聊 pairwise 明文/E2EE,以及四语言 agent 同群的明文/E2EE 矩阵,另包含固定身份目录、容器名、典型命令、浏览器 E2E、C++ Docker 测试、双域 federation 测试和数据保护规则。
60
-
61
- ### AUN SDK 重构修改清单
62
-
63
- 记录本轮 AUN SDK 重构执行中的阶段进度、实际修改点、测试命令、测试结果和遗留事项。它是实施过程中的工作清单,最终以 SDK 文档和 skill 同步结果为准。
64
-
65
- ### 跨语言容器E2E测试方案
66
-
67
- 定义多语言 SDK 同时作为真实客户端运行的目标测试体系。核心模型是每个语言一个客户端容器,全连接同一 AUN server / gateway;业务消息走 AUN,test-runner 通过每个客户端暴露的 test-control HTTP API 编排动作和断言结果。当前单域落地覆盖 Python / TypeScript / Go / C++,浏览器 JavaScript 仍按宿主机 Playwright 运行。
57
+ ### aun测试运行指南
58
+
59
+ 记录当前 AUN 服务与 SDK 在 Docker 单域、双域环境中的实际测试入口。包含 Python、TypeScript、Go、JavaScript、C++ 五语言测试矩阵,Python / TypeScript / Go / C++ 跨语言容器 E2E 的 69 用例矩阵,覆盖 P2P 明文/E2EE、群聊 pairwise 明文/E2EE,以及四语言 agent 同群的明文/E2EE 矩阵,另包含固定身份目录、容器名、典型命令、浏览器 E2E、C++ Docker 测试、双域 federation 测试和数据保护规则。
60
+
61
+ ### AUN SDK 重构修改清单
62
+
63
+ 记录本轮 AUN SDK 重构执行中的阶段进度、实际修改点、测试命令、测试结果和遗留事项。它是实施过程中的工作清单,最终以 SDK 文档和 skill 同步结果为准。
64
+
65
+ ### 跨语言容器E2E测试方案
66
+
67
+ 定义多语言 SDK 同时作为真实客户端运行的目标测试体系。核心模型是每个语言一个客户端容器,全连接同一 AUN server / gateway;业务消息走 AUN,test-runner 通过每个客户端暴露的 test-control HTTP API 编排动作和断言结果。当前单域落地覆盖 Python / TypeScript / Go / C++,浏览器 JavaScript 仍按宿主机 Playwright 运行。
68
68
 
69
69
  ### E2EE V2 简化为 1DH + Per-AID Wrap 方案
70
70
 
@@ -8,18 +8,18 @@ AUN SDK Core 文档在 `docs/` 下。根级索引为 `docs/INDEX.md`,SDK API
8
8
 
9
9
  ### Step 1:先读根级 Layer 1
10
10
 
11
- - `docs/INDEX.md` L7-21:根级文档地图。
11
+ - `docs/INDEX.md` L7-21:根级文档地图。
12
12
 
13
13
  ### Step 2:按主题读根级 Layer 2
14
14
 
15
- - 测试与 E2E:`docs/INDEX.md` L27-32。
16
- - SDK 使用与协议:`docs/INDEX.md` L34-39。
17
- - 诊断与可观测性:`docs/INDEX.md` L41-45。
18
- - E2EE 与跨语言一致性:`docs/INDEX.md` L47-51。
15
+ - 测试与 E2E:`docs/INDEX.md` L27-32。
16
+ - SDK 使用与协议:`docs/INDEX.md` L34-39。
17
+ - 诊断与可观测性:`docs/INDEX.md` L41-45。
18
+ - E2EE 与跨语言一致性:`docs/INDEX.md` L47-51。
19
19
 
20
20
  ### Step 3:需要判断文档价值时读 Layer 3 摘要
21
21
 
22
- - `docs/INDEX.md` L55-87:重点文档摘要。
22
+ - `docs/INDEX.md` L55-87:重点文档摘要。
23
23
 
24
24
  ### Step 4:再读目标文档章节
25
25
 
@@ -27,11 +27,11 @@ AUN SDK Core 文档在 `docs/` 下。根级索引为 `docs/INDEX.md`,SDK API
27
27
 
28
28
  ## 常见查阅场景
29
29
 
30
- | 场景 | 推荐读取 |
31
- | --- | --- |
32
- | 当前 Docker 单域/双域测试怎么跑 | `docs/aun测试运行指南.md` L5-46、L65-80 |
33
- | 本轮 SDK 重构修改清单 | `docs/AUN_SDK_重构修改清单.md` |
34
- | 测试环境数据保护规则 | `docs/aun测试运行指南.md` L48-63 |
30
+ | 场景 | 推荐读取 |
31
+ | --- | --- |
32
+ | 当前 Docker 单域/双域测试怎么跑 | `docs/aun测试运行指南.md` L5-46、L65-80 |
33
+ | 本轮 SDK 重构修改清单 | `docs/AUN_SDK_重构修改清单.md` |
34
+ | 测试环境数据保护规则 | `docs/aun测试运行指南.md` L48-63 |
35
35
  | 单域 Docker 测试容器和命令 | `docs/aun测试运行指南.md` L113-533 |
36
36
  | 跨语言容器 E2E 执行方式 | `docs/aun测试运行指南.md` L146-263 |
37
37
  | 双域 federation 测试容器和命令 | `docs/aun测试运行指南.md` L534-714 |
@@ -6,16 +6,16 @@
6
6
 
7
7
  - **文件大小**: 最大 4KB
8
8
 
9
- ## 文件格式
10
-
11
- agent.md 文件采用 **YAML frontmatter + Markdown 内容 + 签名块(可选,位于文件尾部)** 的格式:
12
-
13
- ```markdown
14
- ---
15
- # YAML 元数据 (核心字段)
16
- aid: "agent-name.aid.pub"
17
- name: "Agent Name"
18
- type: "assistant"
9
+ ## 文件格式
10
+
11
+ agent.md 文件采用 **YAML frontmatter + Markdown 内容 + 签名块(可选,位于文件尾部)** 的格式:
12
+
13
+ ```markdown
14
+ ---
15
+ # YAML 元数据 (核心字段)
16
+ aid: "agent-name.aid.pub"
17
+ name: "Agent Name"
18
+ type: "assistant"
19
19
  version: "1.0.0"
20
20
  description: "一句话描述"
21
21
  tags:
@@ -23,23 +23,23 @@ tags:
23
23
  - tag2
24
24
  ---
25
25
 
26
- # Markdown 正文内容
27
- 详细说明、Skills、使用示例等...
28
-
29
- <!-- AUN-SIGNATURE
30
- cert_fingerprint: sha256:abc123...
31
- timestamp: 1715300000
32
- signature: MEUCIQDx...
33
- -->
34
- ```
35
-
36
- 无签名的文件仍然合法,第一行直接以 `---` 开头。
26
+ # Markdown 正文内容
27
+ 详细说明、Skills、使用示例等...
28
+
29
+ <!-- AUN-SIGNATURE
30
+ cert_fingerprint: sha256:abc123...
31
+ timestamp: 1715300000
32
+ signature: MEUCIQDx...
33
+ -->
34
+ ```
35
+
36
+ 无签名的文件仍然合法,第一行直接以 `---` 开头。
37
37
 
38
38
  ## 签名块规范
39
39
 
40
- ### 位置
41
-
42
- 文件尾部,位于 Markdown 正文之后。
40
+ ### 位置
41
+
42
+ 文件尾部,位于 Markdown 正文之后。
43
43
 
44
44
  ### 格式
45
45
 
@@ -55,26 +55,26 @@ signature: <base64_der>
55
55
  - **timestamp**: 签名时刻的 Unix 时间戳(秒)
56
56
  - **signature**: ECDSA P-256 签名的 DER 编码,Base64 表示
57
57
 
58
- ### 签名计算
59
-
60
- 1. **被签内容(payload)**:签名块开始标记 `<!-- AUN-SIGNATURE` 之前的全部字节
61
- 2. **哈希**:对 payload 计算 SHA-256
62
- 3. **签名**:使用 NIST P-256 私钥对哈希值进行 ECDSA 签名
58
+ ### 签名计算
59
+
60
+ 1. **被签内容(payload)**:签名块开始标记 `<!-- AUN-SIGNATURE` 之前的全部字节
61
+ 2. **哈希**:对 payload 计算 SHA-256
62
+ 3. **签名**:使用 NIST P-256 私钥对哈希值进行 ECDSA 签名
63
63
 
64
64
  ### 验签流程
65
65
 
66
- 1. 检测文件尾部是否存在 `<!-- AUN-SIGNATURE` 签名块
67
- 2. 提取签名块中的 `cert_fingerprint`、`timestamp`、`signature`
68
- 3. 剥离签名块,取剩余内容为 payload
69
- 4. 对 payload 计算 SHA-256
70
- 5. 通过 `cert_fingerprint` 查找对应证书,获取公钥
71
- 6. 使用公钥验证 ECDSA 签名
66
+ 1. 检测文件尾部是否存在 `<!-- AUN-SIGNATURE` 签名块
67
+ 2. 提取签名块中的 `cert_fingerprint`、`timestamp`、`signature`
68
+ 3. 剥离签名块,取剩余内容为 payload
69
+ 4. 对 payload 计算 SHA-256
70
+ 5. 通过 `cert_fingerprint` 查找对应证书,获取公钥
71
+ 6. 使用公钥验证 ECDSA 签名
72
72
 
73
73
  ### 约束
74
74
 
75
- - 签名块必须是文件的最后一个可见块(后面只允许可忽略的空白)
76
- - 签名块与正文之间应至少保留一个换行
77
- - 签名块不计入 4KB 文件大小限制
75
+ - 签名块必须是文件的最后一个可见块(后面只允许可忽略的空白)
76
+ - 签名块与正文之间应至少保留一个换行
77
+ - 签名块不计入 4KB 文件大小限制
78
78
 
79
79
  ## YAML Schema (核心字段)
80
80
 
@@ -158,16 +158,16 @@ YAML 只保留核心元数据,详细信息放在 Markdown 部分:
158
158
 
159
159
  ## 解析方式
160
160
 
161
- 解析时需先检测并跳过尾部签名块:
162
-
163
- ```go
164
- // 1. 检测尾部签名块
165
- if idx := strings.LastIndex(content, "<!-- AUN-SIGNATURE"); idx >= 0 {
166
- content = content[:idx] // 跳过尾部签名块,取 payload
167
- }
168
- // 2. 按原规则解析 frontmatter
169
- parts := strings.SplitN(content, "---", 3)
170
- // parts[0] = "" (空)
171
- // parts[1] = YAML 内容
161
+ 解析时需先检测并跳过尾部签名块:
162
+
163
+ ```go
164
+ // 1. 检测尾部签名块
165
+ if idx := strings.LastIndex(content, "<!-- AUN-SIGNATURE"); idx >= 0 {
166
+ content = content[:idx] // 跳过尾部签名块,取 payload
167
+ }
168
+ // 2. 按原规则解析 frontmatter
169
+ parts := strings.SplitN(content, "---", 3)
170
+ // parts[0] = "" (空)
171
+ // parts[1] = YAML 内容
172
172
  // parts[2] = Markdown 内容
173
173
  ```