@agentunion/fastaun-browser 0.5.4 → 0.5.8

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 (184) hide show
  1. package/CHANGELOG.md +177 -67
  2. package/_packed_docs/AUN/347/246/273/347/272/277/346/216/250/351/200/201/346/216/245/345/205/245/344/270/216/346/274/224/347/244/272/346/214/207/345/215/227.md +290 -0
  3. package/_packed_docs/AUN/347/246/273/347/272/277/346/216/250/351/200/201/346/234/215/345/212/241/346/236/266/346/236/204/344/270/216/350/257/246/347/273/206/345/256/236/347/216/260/350/256/241/345/210/222-codex.md +994 -0
  4. package/_packed_docs/AUN/347/246/273/347/272/277/346/216/250/351/200/201/346/234/215/345/212/241/350/277/220/347/273/264/344/270/216/345/217/221/345/270/203/346/214/207/345/215/227.md +144 -0
  5. package/_packed_docs/CHANGELOG.md +177 -67
  6. package/_packed_docs/INDEX.md +124 -65
  7. package/_packed_docs/KITE_DOCS_GUIDE.md +65 -30
  8. package/_packed_docs/agent.md/SCHEMA.md +83 -58
  9. package/_packed_docs/agent.md/examples/codeagent-claudecode.md +1 -1
  10. package/_packed_docs/agent.md/examples/openclaw-lobster.md +1 -1
  11. package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +1 -1
  12. package/_packed_docs/audit/AUN/346/234/215/345/212/241Go/345/214/226/351/207/215/346/236/204/347/262/276/347/273/206/345/214/226/346/272/220/347/240/201/345/256/241/346/237/245-20260718.md +366 -0
  13. package/_packed_docs/aun/345/205/254/347/275/221/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +234 -0
  14. 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 +1095 -0
  15. package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +1199 -0
  16. package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +6 -4
  17. package/_packed_docs/group-message-rpc-alignment-gaps.md +741 -0
  18. package/_packed_docs/message-online-push-alignment.md +572 -0
  19. package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +58 -20
  20. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +219 -247
  21. package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +14 -14
  22. package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +3 -3
  23. 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 +165 -421
  24. package/_packed_docs/protocol/README.md +1 -0
  25. package/_packed_docs/protocol/aun-docs-guide.md +7 -4
  26. package/_packed_docs/protocol/index.md +25 -19
  27. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +63 -18
  28. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +22 -0
  29. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +93 -84
  30. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +6 -2
  31. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +73 -34
  32. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +3 -3
  33. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +21 -9
  34. package/_packed_docs/sdk/09-group-rpc-manual.md +319 -285
  35. package/_packed_docs/sdk/09-message-rpc-manual.md +144 -103
  36. package/_packed_docs/sdk/09-payload-reference.md +1 -1
  37. package/_packed_docs/sdk/09-storage-rpc-manual.md +14 -3
  38. package/_packed_docs/sdk/09-stream-rpc-manual.md +8 -8
  39. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +34 -23
  40. package/_packed_docs/sdk/CHANGELOG-0.5.6.md +73 -0
  41. package/_packed_docs/sdk/INDEX.md +45 -37
  42. package/_packed_docs/sdk/README.md +11 -9
  43. package/_packed_docs//345/217/221/345/270/203/346/212/245/345/221/212-0.5.6.md +260 -0
  44. package/_packed_docs//346/266/210/346/201/257/345/220/214/346/255/245/344/270/216/345/216/206/345/217/262/346/213/211/345/217/226/344/273/243/347/240/201/345/256/241/346/237/245/351/227/256/351/242/230/346/270/205/345/215/225.md +229 -0
  45. package/_packed_docs//346/266/210/346/201/257/345/220/214/346/255/245/344/270/216/345/216/206/345/217/262/346/213/211/345/217/226/346/224/271/351/200/240/346/226/271/346/241/210.md +750 -0
  46. package/dist/agent-md-schema.d.ts +14 -0
  47. package/dist/agent-md-schema.d.ts.map +1 -0
  48. package/dist/agent-md-schema.js +103 -0
  49. package/dist/agent-md-schema.js.map +1 -0
  50. package/dist/agent-md.d.ts +11 -5
  51. package/dist/agent-md.d.ts.map +1 -1
  52. package/dist/agent-md.js +295 -53
  53. package/dist/agent-md.js.map +1 -1
  54. package/dist/aid-store.d.ts +7 -7
  55. package/dist/aid-store.d.ts.map +1 -1
  56. package/dist/aid-store.js +46 -18
  57. package/dist/aid-store.js.map +1 -1
  58. package/dist/aid.d.ts +2 -0
  59. package/dist/aid.d.ts.map +1 -1
  60. package/dist/aid.js +29 -7
  61. package/dist/aid.js.map +1 -1
  62. package/dist/auth.d.ts.map +1 -1
  63. package/dist/auth.js +31 -11
  64. package/dist/auth.js.map +1 -1
  65. package/dist/bundle.js +29920 -19719
  66. package/dist/cert-utils.d.ts +1 -0
  67. package/dist/cert-utils.d.ts.map +1 -1
  68. package/dist/cert-utils.js +36 -16
  69. package/dist/cert-utils.js.map +1 -1
  70. package/dist/client/delivery.d.ts +106 -11
  71. package/dist/client/delivery.d.ts.map +1 -1
  72. package/dist/client/delivery.js +1925 -374
  73. package/dist/client/delivery.js.map +1 -1
  74. package/dist/client/group-state.d.ts.map +1 -1
  75. package/dist/client/group-state.js +27 -24
  76. package/dist/client/group-state.js.map +1 -1
  77. package/dist/client/lifecycle.d.ts +15 -1
  78. package/dist/client/lifecycle.d.ts.map +1 -1
  79. package/dist/client/lifecycle.js +477 -132
  80. package/dist/client/lifecycle.js.map +1 -1
  81. package/dist/client/mention-mode.d.ts +7 -0
  82. package/dist/client/mention-mode.d.ts.map +1 -0
  83. package/dist/client/mention-mode.js +184 -0
  84. package/dist/client/mention-mode.js.map +1 -0
  85. package/dist/client/peers.d.ts +1 -1
  86. package/dist/client/peers.d.ts.map +1 -1
  87. package/dist/client/peers.js +26 -3
  88. package/dist/client/peers.js.map +1 -1
  89. package/dist/client/rpc-pipeline.d.ts +34 -2
  90. package/dist/client/rpc-pipeline.d.ts.map +1 -1
  91. package/dist/client/rpc-pipeline.js +503 -99
  92. package/dist/client/rpc-pipeline.js.map +1 -1
  93. package/dist/client/runtime.d.ts +1 -3
  94. package/dist/client/runtime.d.ts.map +1 -1
  95. package/dist/client/runtime.js +4 -7
  96. package/dist/client/runtime.js.map +1 -1
  97. package/dist/client/v2-e2ee.d.ts +43 -2
  98. package/dist/client/v2-e2ee.d.ts.map +1 -1
  99. package/dist/client/v2-e2ee.js +931 -138
  100. package/dist/client/v2-e2ee.js.map +1 -1
  101. package/dist/client.d.ts +46 -15
  102. package/dist/client.d.ts.map +1 -1
  103. package/dist/client.js +785 -304
  104. package/dist/client.js.map +1 -1
  105. package/dist/errors.d.ts.map +1 -1
  106. package/dist/errors.js +4 -1
  107. package/dist/errors.js.map +1 -1
  108. package/dist/facades.d.ts +26 -1
  109. package/dist/facades.d.ts.map +1 -1
  110. package/dist/facades.js +142 -60
  111. package/dist/facades.js.map +1 -1
  112. package/dist/group-id.d.ts.map +1 -1
  113. package/dist/group-id.js +2 -17
  114. package/dist/group-id.js.map +1 -1
  115. package/dist/group-index.d.ts +6 -1
  116. package/dist/group-index.d.ts.map +1 -1
  117. package/dist/group-index.js +44 -25
  118. package/dist/group-index.js.map +1 -1
  119. package/dist/index.d.ts +5 -4
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +3 -2
  122. package/dist/index.js.map +1 -1
  123. package/dist/keystore/index.d.ts +10 -5
  124. package/dist/keystore/index.d.ts.map +1 -1
  125. package/dist/keystore/indexeddb-identity-store.d.ts +0 -12
  126. package/dist/keystore/indexeddb-identity-store.d.ts.map +1 -1
  127. package/dist/keystore/indexeddb-identity-store.js +0 -60
  128. package/dist/keystore/indexeddb-identity-store.js.map +1 -1
  129. package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
  130. package/dist/keystore/indexeddb-shared.js +9 -5
  131. package/dist/keystore/indexeddb-shared.js.map +1 -1
  132. package/dist/keystore/indexeddb-token-store.d.ts +3 -1
  133. package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
  134. package/dist/keystore/indexeddb-token-store.js +47 -2
  135. package/dist/keystore/indexeddb-token-store.js.map +1 -1
  136. package/dist/register-flow.d.ts.map +1 -1
  137. package/dist/register-flow.js +28 -3
  138. package/dist/register-flow.js.map +1 -1
  139. package/dist/seq-tracker.d.ts +28 -8
  140. package/dist/seq-tracker.d.ts.map +1 -1
  141. package/dist/seq-tracker.js +224 -61
  142. package/dist/seq-tracker.js.map +1 -1
  143. package/dist/storage/vfs.d.ts +1 -0
  144. package/dist/storage/vfs.d.ts.map +1 -1
  145. package/dist/storage/vfs.js +26 -2
  146. package/dist/storage/vfs.js.map +1 -1
  147. package/dist/tools/cross-sdk-agent.js +399 -11
  148. package/dist/tools/cross-sdk-agent.js.map +1 -1
  149. package/dist/transport.d.ts +12 -0
  150. package/dist/transport.d.ts.map +1 -1
  151. package/dist/transport.js +226 -102
  152. package/dist/transport.js.map +1 -1
  153. package/dist/v2/session/session.d.ts.map +1 -1
  154. package/dist/v2/session/session.js +3 -4
  155. package/dist/v2/session/session.js.map +1 -1
  156. package/dist/v2/state/commitment.d.ts.map +1 -1
  157. package/dist/v2/state/commitment.js +1 -2
  158. package/dist/v2/state/commitment.js.map +1 -1
  159. package/dist/validators.d.ts.map +1 -1
  160. package/dist/validators.js +8 -14
  161. package/dist/validators.js.map +1 -1
  162. package/dist/version.d.ts +1 -1
  163. package/dist/version.js +1 -1
  164. package/package.json +11 -9
  165. package/dist/group-resources.d.ts +0 -98
  166. package/dist/group-resources.d.ts.map +0 -1
  167. package/dist/group-resources.js +0 -635
  168. package/dist/group-resources.js.map +0 -1
  169. package/dist/keystore/indexeddb.d.ts +0 -179
  170. package/dist/keystore/indexeddb.d.ts.map +0 -1
  171. package/dist/keystore/indexeddb.js +0 -2031
  172. package/dist/keystore/indexeddb.js.map +0 -1
  173. package/dist/namespaces/auth.d.ts +0 -98
  174. package/dist/namespaces/auth.d.ts.map +0 -1
  175. package/dist/namespaces/auth.js +0 -992
  176. package/dist/namespaces/auth.js.map +0 -1
  177. package/dist/namespaces/custody.d.ts +0 -51
  178. package/dist/namespaces/custody.d.ts.map +0 -1
  179. package/dist/namespaces/custody.js +0 -302
  180. package/dist/namespaces/custody.js.map +0 -1
  181. package/dist/namespaces/meta.d.ts +0 -109
  182. package/dist/namespaces/meta.d.ts.map +0 -1
  183. package/dist/namespaces/meta.js +0 -549
  184. package/dist/namespaces/meta.js.map +0 -1
@@ -0,0 +1,144 @@
1
+ # AUN 离线推送服务运维与发布指南
2
+
3
+ 本文档定义 Push Service V1 的发布门、运行诊断、灰度和回滚。协议语义以 `docs/superpowers/契约冻结-v3-to-v4.md` 为准,架构说明见 `docs/superpowers/specs/2026-07-24-push-service-design-v3.md`,实施范围见 v4 计划。
4
+
5
+ ## 1. 当前发布结论
6
+
7
+ - 隔离 PoC 可以运行;生产发布仍被 token 安全门硬阻断。
8
+ - 明文 push token 只允许隔离 PoC。生产环境必须使用可信加密与密钥管理,未满足时服务应拒绝启动,而不是降级运行。
9
+ - V1 不转发 `push.offline_message` 到 federation。当前跨域 federation 验收未执行,不得标记为通过。
10
+ - Message/Group 的消息成功语义不依赖 Push Service;推送停用或故障不应改变消息主链结果。
11
+
12
+ ## 2. 发布前强制门
13
+
14
+ 每次构建或配置变更后必须重新执行以下门禁:
15
+
16
+ 1. 六项冻结契约及 Push、Gateway、Message、Group、Launcher 关联回归全部通过。
17
+ 2. 本地 P2P、Group、多设备、在线抑制、聚合、频控、ACK、响应丢失与 dedup、timeout、恢复、迁移和优雅关闭证据完整。
18
+ 3. 日志文件和相关容器 stdout/stderr 的敏感信息扫描为零命中。
19
+ 4. 容量、公平性、batch 数量、事件字节上限和 `max_inflight_per_server` 自动化测试通过。
20
+ 5. 固定身份材料只读复用;不得删除、重建或修改既有身份和数据库。
21
+ 6. 生产 token 加密门满足;否则只能发布到隔离 PoC。
22
+
23
+ 任何未解释失败、环境缺失或未执行项都必须明确记录,不能用 mock 或空桩替代真实证据。
24
+
25
+ ## 3. 运行依赖与启动判定
26
+
27
+ Push Service 依赖:
28
+
29
+ - Kernel 生命周期连接;
30
+ - `aun_push` 数据库及已完成的版本化 migration;
31
+ - 唯一可用 Gateway 的 discovery、service-plane attach 和 heartbeat;
32
+ - 有效且受保护的诊断凭据。
33
+
34
+ 状态含义:
35
+
36
+ | 状态 | 运维判断 |
37
+ | --- | --- |
38
+ | `healthy` | migration、数据库、Gateway attach 和 runtime 均已就绪 |
39
+ | `waiting` | 尚未完成首次就绪,常见于零 Gateway 或初始化中 |
40
+ | `blocked` | 发现多个可用 Gateway 等违反 V1 唯一性约束的条件 |
41
+ | `degraded` | 曾经就绪,但数据库、Gateway 或调度运行出现故障 |
42
+ | `draining` | 已拒绝新变更请求,仍保留 ACK 通道并等待 in-flight 收敛 |
43
+
44
+ 服务不得在 migration 失败、Gateway 数量非法或依赖未就绪时伪装为 `healthy`。
45
+
46
+ ## 4. 诊断入口
47
+
48
+ 内部诊断端点使用 Bearer 认证,只允许集群私网访问:
49
+
50
+ - `/internal/diagnostics/health`
51
+ - `/internal/diagnostics/status`
52
+ - `/internal/diagnostics/metrics`
53
+ - `/internal/diagnostics/capabilities`
54
+
55
+ `status.business` 给出候选队列深度、in-flight、最老候选等待时间,以及最近一次调度、维护和存储快照状态。
56
+
57
+ `metrics` 的核心分组:
58
+
59
+ | 分组 | 主要用途 |
60
+ | --- | --- |
61
+ | `rpc` | register、unregister、enqueue、ack 的调用量、结果、错误码和延迟 |
62
+ | `scheduler` | claim、计划、batch、dispatch、dedup、timeout、恢复、in-flight、事件字节和迭代耗时 |
63
+ | `scheduler_outcomes_total` | 在线抑制、无 registration、频控、过期、Gateway 未知和永久拒绝等原因计数 |
64
+ | `maintenance` | registration 失效、candidate 过期和终态数据清理结果 |
65
+ | `storage` | candidate、delivery、batch 状态计数、队列深度、in-flight 和最老候选等待时间 |
66
+
67
+ 存储状态快照默认每 5 秒采样一次,因此用于趋势、告警和故障定位,不是事务级实时读数。指标只包含计数、耗时和受控状态,不包含 AID、token、消息内容或 payload。
68
+
69
+ ## 5. 告警判断
70
+
71
+ 优先处理以下信号:
72
+
73
+ - `lifecycle_state` 为 `blocked`、`degraded` 或长期 `waiting`;
74
+ - `storage.candidate_queue_depth` 持续增长,且 `oldest_candidate_age_ms` 接近 candidate TTL;
75
+ - `scheduler.inflight_batches` 长期不下降,或 `timeouts_total` 连续增长;
76
+ - `scheduler_outcomes_total.online_unknown`、`push_server_unknown` 或 `gateway_result_unknown` 持续增长;
77
+ - `rpc.errors_by_code` 中 timeout、unavailable 或 conflict 异常增长;
78
+ - `maintenance.errors_total` 增长或存储快照长时间不更新;
79
+ - Message/Group 候选队列出现满、TTL 丢弃或 drain 超时日志。
80
+
81
+ 排障时按 candidate → delivery → batch → Gateway connection 的关联标识查日志;不得为了诊断打开 token 或消息正文日志。
82
+
83
+ ## 6. 性能与容量基线
84
+
85
+ 2026-07-26 Windows amd64 基线,512 个候选、4 个 Push Server、每目标 1 个 delivery:
86
+
87
+ | 指标 | 结果 |
88
+ | --- | ---: |
89
+ | 三轮五次规划 P95 | 3.7478–5.7713 ms;中位 4.3937 ms |
90
+ | benchmark | 3.424612–4.595007 ms/op;中位 3.667848 ms/op |
91
+ | 内存 | 4,960,258–4,960,760 B/op |
92
+ | 分配 | 28,954–28,956 allocs/op |
93
+
94
+ 自动灾难性退化门为 512 候选规划 P95 不超过 2 秒。该基线只覆盖内存调度规划,不代表数据库、Gateway、移动推送平台或公网端到端吞吐。
95
+
96
+ 容量配置必须同时满足:
97
+
98
+ - 单批 delivery 数量和事件字节上限;
99
+ - 每 Push Server 最大 in-flight;
100
+ - 全局、Push Server 和目标频控;
101
+ - registration/candidate TTL、ACK timeout、重试上限和终态保留;
102
+ - 同一 Push Server 内目标公平轮询,以及不同 Push Server 间公平轮询。
103
+
104
+ ## 7. 安全与身份材料
105
+
106
+ - 普通日志、归档日志、crash JSON 和容器输出均必须经过敏感信息扫描。
107
+ - token 只允许记录不可逆短指纹;Bearer、seed、私钥和消息内容不得进入诊断或日志。
108
+ - Launcher 启动环境摘要必须按变量名统一脱敏 token、password、secret、HMAC、seed、key、DSN,以及带用户信息的 URL。
109
+ - Docker Push Server 服务身份使用只读 PEM 证书和私钥,不需要 SDK seed。
110
+ - SDK `key.json` 身份的 seed 在构造 `AIDStore` 或对应身份存储时显式传入;正常运行和身份目录复制不读取 `.seed` 文件。
111
+ - SDK 不提供 `.seed` 文件读取或迁移入口;轮换 seed 时必须显式提供当前与新的 seed_password。
112
+
113
+ ## 8. 隔离 PoC 灰度
114
+
115
+ 1. 先以 `AUN_PUSH_ENABLED=false` 部署镜像并完成 migration、诊断和三中心纳管检查。
116
+ 2. 只接入隔离 Mock Push Server 和授权的测试安装,不接真实生产 token。
117
+ 3. 使用较低的 batch、频控和 in-flight 上限启用 Push Service。
118
+ 4. 再分别开启 `AUN_MESSAGE_OFFLINE_PUSH_ENABLED`、`AUN_GROUP_OFFLINE_PUSH_ENABLED`,观察候选队列、在线抑制、ACK、timeout 和清理指标。
119
+ 5. 扩大覆盖前必须确认消息主链结果不受推送故障影响,且日志扫描仍为零命中。
120
+
121
+ 在可信 token 加密完成前,不存在生产灰度路径。
122
+
123
+ Mock Push Server 使用修改后的 Python SDK 作为普通长连接客户端。SDK 自身仍把认证类终止 close code(包括 4008)视为停止自动重连;Mock 的常驻进程只在 SDK 已结束内部重连且处于离线终态后,由应用层守护重新调用 `connect()`。这是测试工具的恢复策略,不改变公共 SDK 重连契约。
124
+
125
+ ## 9. 回滚
126
+
127
+ 回滚顺序:
128
+
129
+ 1. 先关闭 `AUN_MESSAGE_OFFLINE_PUSH_ENABLED` 和 `AUN_GROUP_OFFLINE_PUSH_ENABLED`,停止产生新候选。
130
+ 2. 等待生产者候选队列 drain;超时项按既定允许丢失边界记录指标和日志。
131
+ 3. 将 `AUN_PUSH_ENABLED=false`,让 Push Service 进入可管理的停用模式并完成优雅关闭。
132
+ 4. 如需回退镜像,在服务停用后执行;保留 `aun_push` schema 和数据,不做逆向 migration、清表或身份重建。
133
+ 5. 回滚后验证 Message/Group 发送、pull 和 ack 主链正常。
134
+
135
+ Push 是辅助唤醒链路,回滚不得触碰消息正文、SDK 固定身份或既有 AID 数据。
136
+
137
+ ## 10. 已知限制
138
+
139
+ - V1 只支持单 Push Service、单可用 Gateway 和批次级 ACK。
140
+ - `push.offline_message` 不跨 federation;跨域验收当前未执行。
141
+ - Push Service 不直接调用 APNs/FCM,移动平台适配属于 Push Server 职责。
142
+ - 明文 token 仅限隔离 PoC,生产发布仍被硬阻断。
143
+ - 诊断存储快照是周期采样;瞬时值应结合 Scheduler 日志和持久状态判断。
144
+ - 当前性能数字是调度规划微基准,不替代真实数据库和公网容量测试。
@@ -6,113 +6,223 @@
6
6
 
7
7
  ---
8
8
 
9
- ## 0.5.4 — 2026-07-09
9
+ ## 0.5.8 — 2026-08-30
10
10
 
11
11
  ### 新功能
12
12
 
13
- #### 通用 indexed document settings
14
- - 浏览器 `GroupFacade` 新增 `getSettingWithIndex()` / `updateSettingWithIndex()`,支持按 `keyName` 管理 `{keyName}.content` `{keyName}.attachments` 两类文档型 indexed settings。
15
- - `keyName` 增加统一校验:必须匹配 `^[A-Za-z][A-Za-z0-9_-]{0,63}$`,并拒绝 `join`、`group`、`index`、`visibility` 等保留基名。
16
- - `getAnnouncement()` / `updateAnnouncement()` `getRules()` / `updateRules()` 复用通用 indexed document setting 路径,继续通过 signed `group.index` + `expected_index_etag` CAS 写入。
13
+ #### AID 注册与 agent.md
14
+ - `AIDStore.register()` 默认生成符合 schema `agent.md`(`aid`、`type: "agent"` 等字段),使用对应 AID 签名并上传;`uploadAgentMd()` 仍可按需显式替换内容,也支持由另一个本地 uploader AID 认证代传。
15
+ - 增加 agent.md 的严格 frontmatter、UTF-8/Base64、大小、证书有效期、证书指纹、公钥指纹和签名校验;校验失败不会覆盖已有内容或可信缓存。
16
+ - 新版本连接能力声明 `agent_md_validation_v1`;收到缺少 agent.md `-32003` 时自动生成、签名、上传并重试原 RPC。恢复只针对当前 AID,群 agent.md 恢复只由持有 group AID 私钥的群主执行。
17
17
 
18
- #### 入群要求附件
19
- - `getJoinRequirements()` / `updateJoinRequirements()` 支持 `attachments`,对应服务端 `join.attachments` indexed setting
20
- - `join.attachments` 与公告/群规附件保持同一类 `group.fs` 引用结构,可通过 group.index 签名索引同步。
18
+ #### 群身份与 group agent.md
19
+ - 命名群的 `createGroup()` `group.create` 时携带新生成的 group AID 公钥和曲线,并要求服务端返回匹配的 group AID 证书;匿名群先创建,再按原始 `groupId` 绑定证书并导入本地 group AID
20
+ - `bindGroupAid()`、`renewGroupAid()` 和群主转移完成流程校验证书、公钥和用途,并自动上传 `type: "group"` group agent.md;内容由 group AID 签名,群主 AID 负责认证上传。
21
+ - group agent.md 可以事后上传,但在上传有效证书和 agent.md 前,群管理、群消息、`group.fs` 等后续群 RPC 继续受 Gateway 限制;历史群缺证书或缺 group agent.md 的自动修复仅允许群主执行。
21
22
 
22
- #### Group FS 角色 ACL
23
- - 服务端 group.fs 命名空间新增受保护 `.group` 控制目录,并为 owner/admin 同步基线角色 ACL。
24
- - owner/admin 默认可写群自有区;admin 可管理群自有区角色 ACL。
25
- - `role:member` 支持按具体业务目录授予 `rw`,允许成员创建/上传,但不允许删除、重命名或移动群自有区内容。
23
+ ### 安全性
24
+
25
+ - Gateway client-vs-gateway RPC 入口校验客户端 agent.md、普通 AID 证书、group AID 证书及 group agent.md;`group.create`、`group.bindGroupAid`、`group.renewGroupAid` 等建群/绑定例外保留必要的恢复路径。
26
+ - 上述准入只对 connect 协商声明 `agent_md_validation_v1` 的新 SDK 生效,未声明能力的旧 SDK 保持原有行为;Gateway 同时收紧 AID type、group namespace、RPC 目标和路由边界校验。
27
+ - agent.md、证书和身份解析采用带 TTL 的正/负缓存,支持并发请求合并、容量上限及 CA 写入、agent.md 上传和相关事件触发的失效;代际校验防止过期查询回写缓存。
26
28
 
27
29
  ### 修复
28
30
 
29
- - 修复 Storage 直接入口对群自有区删除/移动/重命名权限检查不足的问题,删除类操作统一走 `delete` 权限判定。
30
- - 修复旧 group AID 证书类型仍为 normal 时,Storage 无法通过 group resolver 判定群空间的问题。
31
- - 兼容 CA 续期时 PEM 公钥与 SPKI base64 的等价比较,并兼容托管续期返回 `cert_pem` / `new_cert` 字段。
31
+ #### Pull gate 与未读提示
32
+ - `AUNClient` 统一使用一个 pull gate 和队列,前台 pull 优先于后台 pull,二者共享 namespace 去重;P2P 作为一个 namespace,每个 group 独立 namespace,后台请求不旁路也不丢弃。
33
+ - pull 生命周期纳入 `idle`、`pulling`、`processing` 等状态和专用 watchdog;从拉取开始计时,约 3 秒超时即复位并继续队列,应用触发和新 push 会主动唤醒状态机。续拉在响应处理完成后重新入队并置于队尾。
34
+ - `client.online` 时服务端为 P2P 及存在未读消息或事件的群发送 unread hint;SDK 每条 hint 转换为一次 background forward pull,按 namespace 去重。
35
+
36
+ #### V2 消息窗口与游标
37
+ - Forward 页忽略页内空洞并推进到 pulled page 最大 seq;先完成解密/发布,再一次性提交本页连续游标并发送 ACK 或 piggyback ACK。缺少 SPK/IK 时异步 bootstrap,不阻塞页处理;有密钥但解密失败时发布结构化失败事件后再推进游标。
38
+ - 修正 P2P/群 V2 的 1DH/3DH、IK/SPK bootstrap、self-sync、forward cursor/ACK、重叠页去重及跨页有序投递;服务端 ACK 水位不足时保留待确认状态并在后续 pull 重试。
39
+ - Message/Group thought 存储与响应结构统一,并增加响应预算/大小限制;Go `CollabActionResult` 兼容 `removed` 布尔值和整数格式。
40
+
41
+ #### Gateway 与服务连接可靠性
42
+ - 加固 service attach、连接替换、关闭码、协议错误预算、超时以及 reader/close 竞态;Python/Go 服务端行为和合同测试保持一致。
43
+ - nameservice agent.md upsert、上传验证及数据库/快照兼容性同步修正;SDK 测试器使用阿里云 PyPI 镜像缓解下载超时。
32
44
 
33
45
  ### 改进
34
46
 
35
- - message/group WAL writer 的 `micro_wait` 支持 auto 预算模型,并扩展性能统计输出,便于观察批量写入队列深度与 pending 状态。
36
- - group.fs 命名空间在读取 group 记录时支持懒修复,缺失 baseline ACL 时可重试同步。
37
- - SDK 包版本、运行时 `VERSION` 和 conformance 期望版本更新为 `0.5.4`。
47
+ - SDK 包版本、锁文件版本、运行时 `VERSION` V2 E2EE envelope `sdk_version` 更新为 `0.5.8`。
48
+ - 低层 agent.md 上传能力继续由 `AIDStore` 提供,`AUNClient` 通过高层注册、建群和恢复流程编排;agent.md 替换仍保留为可选、按需操作。
38
49
 
39
50
  ### 测试
40
51
 
41
- - 扩展浏览器 GroupFacade group index 单元测试,覆盖通用 indexed document setting、`join.attachments` 缓存读取和 group.index 写入路径。
42
- - 更新 conformance 版本期望到 `0.5.4`。
43
- - 服务端测试扩展 group settings、group.fs namespace / role ACL、Storage 群自有区权限和 CA 续期兼容性。
44
-
45
- ---
52
+ - 新增 AID 类型和 Gateway 路由准入的单元、集成、E2E 及跨 SDK 测试,覆盖新旧能力声明、证书/agent.md 缺失恢复、群主权限和缓存失效。
53
+ - 扩展 agent.md、群身份绑定/续期、group.fs、V2 E2EE、pull gate 状态机、unread hint、游标/ACK、thought 响应预算和服务连接合同测试。
46
54
 
47
- ## 0.5.3 — 2026-07-07
55
+ ## 0.5.7 — 2026-08-20
48
56
 
49
57
  ### 新功能
50
58
 
51
- #### group.index 索引化群设置
52
- - 新增浏览器 `group.index` JSONL 工具:支持 canonical entries、body hash、etag、ECDSA P-256 签名/验签,以及将 settings 更新合并为带 `group.index` 的原子写入。
53
- - `GroupFacade` 新增 `checkGroupIndex` / `getGroupIndex` / `updateGroupIndex`,写入时携带 `expected_index_etag` 做 CAS,并在冲突后重拉索引重试。
54
- - 浏览器 IndexedDB TokenStore 新增 `group_index_cache`,按 local AID + group AID 持久化 index JSONL、remote meta、本地 etag、settings cache 和 entry etags。
55
- - 入口导出 `GROUP_INDEX_KEY`、`GROUP_INDEX_SCHEMA`、`GroupIndexMetaCache`、`buildSignedGroupIndex`、`verifyGroupIndex`、`prepareGroupSettingsWithIndex` group.index API
59
+ #### 首次连接自动重试
60
+ - `connect()` 在首次 discovery、认证或 Gateway WebSocket 建连遇到可重试的瞬时错误时,进入与断线重连一致的指数退避生命周期;每轮重新执行完整 discovery/认证并使用最新凭据。
61
+ - 认证、权限、参数和状态类永久错误仍立即返回,不创建后台重连任务。
62
+
63
+ #### Mail facade 与当前令牌 API
64
+ - 新增 `client.mail` / `MailFacade`,提供 `send()`、`get()`、`list()`、`delete()`、`move()`、`mark()`、`search()`、`getAttachment()`、`getQuota()`、`health()` 和 `status()`;`mail.send` 按非幂等 RPC 使用 35 秒超时。
65
+ - 新增 `getAccessToken()`,同步读取后台刷新任务维护的最新 access token,供应用在每次外部 HTTP 数据面请求前取用;getter 本身不发起认证、刷新或网络请求。
56
66
 
57
67
  ### 修复
58
68
 
59
- #### 撤回去重与有序投递
60
- - `message.recalled` 改为专用处理路径,支持 P2P 撤回 tombstone 的有序投递、自动 ack、gap fill 和按原消息标识去重,避免 push / pull 对同一次撤回重复回调。
61
- - 群撤回去重键改为规范化 group id + 原消息 id/seq,忽略 `recalled_at`,并补齐顶层 recall 字段归一化。
62
- - 群消息 pull / legacy fallback 识别 `group.message_recalled` tombstone,避免把撤回通知作为普通群消息投递。
63
- - P2P 与群 push 按 namespace 串行化处理,降低异步解密和投递导致的乱序风险。
64
- - V2 P2P / Group pull 页内消息按 `seq` 排序后处理,避免服务端返回无序时影响本地 seq 推进。
69
+ - 引入重连代际所有权;显式 `connect()` / `disconnect()` / `close()` 可终止旧重连代,旧任务不能清理或覆盖新连接,事件回调内触发生命周期操作也不会自锁。
70
+ - 收口群 ID 语义:`g-` 不再具有特殊含义,所有群 base 统一按 4–64 字符规则校验;移除 `base@issuer` 兼容输入,仅保留 `group.{issuer}/{base}`、`base.issuer` 和本域短格式。
71
+ - `stream/created` `stream/closed` 内部事件重新发布给公共订阅者。
72
+ - Group tail/history 遇到缺失 payload 的不完整 V1 行时采用有界跳过或失败语义,避免阻断后续同步。
65
73
 
66
74
  ### 改进
67
75
 
68
- - `RPCTransport` `_meta` observer 支持异步回调;RPC 成功响应会等待 observer 完成,事件/通知路径统一走安全的 meta observer 分发。
69
- - `getAnnouncement` / `getRules` / `getJoinRequirements` 优先使用 group.index settings cache;`updateAnnouncement` / `updateRules` / `updateJoinRequirements` 改走 `updateGroupIndex`,保持索引与设置同步。
70
- - cross-sdk JS agent 支持 `sdk.update_group_index` 调用,便于跨 SDK 测试索引化群设置。
71
- - SDK 包版本、运行时 `VERSION` 和 conformance 期望版本更新为 `0.5.3`。
76
+ - SDK 包版本、锁文件版本、运行时 `VERSION` conformance 期望版本更新为 `0.5.7`。
72
77
 
73
78
  ### 测试
74
79
 
75
- - 新增 group.index 单元测试,覆盖 hash/etag、签名/验签、settings merge、RPC meta stale/fresh、async meta observer 和 IndexedDB 持久化恢复。
76
- - 新增 GroupFacade group.index 单元测试,覆盖 CAS 写入、冲突重试、远端索引验签、tamper 拒绝、settings cache 和便利方法索引化写入。
77
- - 新增浏览器 E2E:验证签名 `group.index` 写入、裸 settings 写入拒绝、CAS 冲突重试和最终 settings 一致性。
78
- - 扩展撤回投递测试,覆盖 P2P/group recall 顶层字段归一化、push/pull tombstone 去重和有序投递。
79
- - 更新 group settings 与签名审计 E2E,使公告/群规等索引化 settings 通过 `updateGroupIndex` 写入。
80
-
81
- ---
80
+ - 新增首连认证/建连失败、永久错误、重连代际取消、事件回调重入、最新 token getter Mail facade 单元测试。
81
+ - 扩展群 ID 校验、浏览器跨域 Group FS、新设备群历史同步、V2 E2EE replay guard E2E 测试。
82
82
 
83
- ## 0.5.2 — 2026-07-05
83
+ ## 0.5.6 — 2026-08-13
84
84
 
85
85
  ### 新功能
86
86
 
87
- #### agent.md 元数据
88
- - 支持从 RPC `_meta.agent_md_etags.group` V2 envelope `agent_md.group` 观察群组 agent.md ETag / Last-Modified,并自动维护群 AID 的本地缓存。
89
- - 群消息 agent.md 观察逻辑补齐 sender / group 两类来源,提升浏览器端跨设备、跨群消息场景下的版本一致性提示能力。
87
+ #### V2 消息窗口与实时推送
88
+ - 完成 `tail` / `forward` / `history` 消息窗口、IndexedDB seq 状态持久化和 pull gate 调度,统一 P2P 与群消息的补洞、确认和有序投递。
89
+ - 连接认证时声明 `inline_realtime_payload_v1`;实时事件优先使用内联消息载荷,离线或不完整事件继续通过 pull 回退。
90
+ - 对齐 Message/Group self-sync 与 bootstrap 契约,补齐浏览器多设备同步状态处理。
90
91
 
91
- ### 修复
92
+ #### 群消息提及过滤
93
+ - 新增 `mention_mode` 归一化与投递过滤,兼容 `disabled`、`mention-only` 及历史 `mention_only` 表示。
94
+
95
+ ### 安全性
92
96
 
93
- #### V2 P2P / Group 拉取
94
- - `message.v2.pull` / `group.v2.pull` 自动 ack 改为通过下一次 pull `ack_up_to_seq` piggyback,减少独立 ack RPC。
95
- - 修复非满页返回 `has_more=true` 时盲目续拉的问题;满页继续立即拉,非满页仅在有待合并 ack 时追加一页。
96
- - 过滤 `seq <= after_seq` 的 stale 原始消息,避免重复处理或错误推进 ack。
97
- - stale 原始页未推进 contiguous seq 时不再发送自动 ack,避免把未真正拉齐的数据误确认。
97
+ - `lookupPeer()` 在内存 peer cache 未命中或指纹不匹配时自动获取并校验证书;支持按签名指纹精确加载历史证书。
98
+ - `group.index` `agent.md` 在下载或更新提交 IndexedDB 缓存前验签;rules、announcement、join requirements 等索引化 settings 逐项校验已签名索引中的 ETag。签名者权限、摘要或内容校验失败时不落盘,也不参与业务读取;已验证缓存的普通读取不重复验签。
99
+ - 修复跨域 Storage 下载的 bearer 隔离,并加固浏览器连接/重连及 Gateway 候选故障转移。
98
100
 
99
101
  ### 改进
100
102
 
101
- - V2 pull 默认/最大 page limit 收敛为 50,并对传入 `limit` 做 1..50 夹取。
102
- - V2 pull 增加非满页 tail delay:`1000ms / (pulled_messages + 1)`,最大 500ms;满页和空页仍立即结束或续拉。
103
- - SDK 包版本、运行时 `VERSION` conformance 期望版本更新为 `0.5.2`。
103
+ - 收口短 RPC、challenge/response、前置帧和浏览器 transport 竞态;后台补洞/ack 调度不再阻塞前台 RPC。
104
+ - 扩展浏览器 cross-SDK agent 与诊断契约,覆盖消息窗口和 inline realtime 场景;浏览器 SDK 本版本未新增离线 Push facade。
105
+ - 浏览器使用 IndexedDB keystore,不适用文件型 `.seed` 自动迁移;不新增文件型 `change-seed` 命令。
106
+ - SDK 包版本、运行时 `VERSION` 和 conformance 期望版本更新为 `0.5.6`。
104
107
 
105
108
  ### 测试
106
109
 
107
- - 扩展 V2 P2P / Group pull 单元测试,覆盖 `ack_up_to_seq` piggyback、非满页 tail delay、stale 过滤和 max pages flush。
108
- - 新增 `v2-e2ee-coordinator` 组件边界测试,验证自动 ack 通过下一页 pull piggyback。
109
- - 扩展 agent.md 和 conformance 测试,覆盖群组 ETag 观察及 0.5.2 版本声明。
110
-
111
- ---
112
-
113
- ## 0.5.1 — 2026-07-01
110
+ - 新增消息窗口、inline realtime push、mention mode、self-sync/bootstrap、peer identity、group index、`agent.md` IndexedDB/浏览器 E2E 测试。
111
+ - 扩展 cross-SDK contract vectors,覆盖验签后缓存提交和窗口状态一致性。
114
112
 
115
- ### ⚠️ 重大变更(Breaking Changes)
113
+ ## 0.5.5 2026-07-14
114
+
115
+ ### 维护
116
+
117
+ - SDK 包版本、运行时 `VERSION` 和 conformance 期望版本更新为 `0.5.5`。
118
+
119
+ ## 0.5.4 — 2026-07-09
120
+
121
+ ### 新功能
122
+
123
+ #### 通用 indexed document settings
124
+ - 浏览器 `GroupFacade` 新增 `getSettingWithIndex()` / `updateSettingWithIndex()`,支持按 `keyName` 管理 `{keyName}.content` 与 `{keyName}.attachments` 两类文档型 indexed settings。
125
+ - `keyName` 增加统一校验:必须匹配 `^[A-Za-z][A-Za-z0-9_-]{0,63}$`,并拒绝 `join`、`group`、`index`、`visibility` 等保留基名。
126
+ - `getAnnouncement()` / `updateAnnouncement()` 与 `getRules()` / `updateRules()` 复用通用 indexed document setting 路径,继续通过 signed `group.index` + `expected_index_etag` CAS 写入。
127
+
128
+ #### 入群要求附件
129
+ - `getJoinRequirements()` / `updateJoinRequirements()` 支持 `attachments`,对应服务端 `join.attachments` indexed setting。
130
+ - `join.attachments` 与公告/群规附件保持同一类 `group.fs` 引用结构,可通过 group.index 签名索引同步。
131
+
132
+ #### Group FS 角色 ACL
133
+ - 服务端 group.fs 命名空间新增受保护 `.group` 控制目录,并为 owner/admin 同步基线角色 ACL。
134
+ - owner/admin 默认可写群自有区;admin 可管理群自有区角色 ACL。
135
+ - `role:member` 支持按具体业务目录授予 `rw`,允许成员创建/上传,但不允许删除、重命名或移动群自有区内容。
136
+
137
+ ### 修复
138
+
139
+ - 修复 Storage 直接入口对群自有区删除/移动/重命名权限检查不足的问题,删除类操作统一走 `delete` 权限判定。
140
+ - 修复旧 group AID 证书类型仍为 normal 时,Storage 无法通过 group resolver 判定群空间的问题。
141
+ - 兼容 CA 续期时 PEM 公钥与 SPKI base64 的等价比较,并兼容托管续期返回 `cert_pem` / `new_cert` 字段。
142
+
143
+ ### 改进
144
+
145
+ - message/group WAL writer 的 `micro_wait` 支持 auto 预算模型,并扩展性能统计输出,便于观察批量写入队列深度与 pending 状态。
146
+ - group.fs 命名空间在读取 group 记录时支持懒修复,缺失 baseline ACL 时可重试同步。
147
+ - SDK 包版本、运行时 `VERSION` 和 conformance 期望版本更新为 `0.5.4`。
148
+
149
+ ### 测试
150
+
151
+ - 扩展浏览器 GroupFacade group index 单元测试,覆盖通用 indexed document setting、`join.attachments` 缓存读取和 group.index 写入路径。
152
+ - 更新 conformance 版本期望到 `0.5.4`。
153
+ - 服务端测试扩展 group settings、group.fs namespace / role ACL、Storage 群自有区权限和 CA 续期兼容性。
154
+
155
+ ---
156
+
157
+ ## 0.5.3 — 2026-07-07
158
+
159
+ ### 新功能
160
+
161
+ #### group.index 索引化群设置
162
+ - 新增浏览器 `group.index` JSONL 工具:支持 canonical entries、body hash、etag、ECDSA P-256 签名/验签,以及将 settings 更新合并为带 `group.index` 的原子写入。
163
+ - `GroupFacade` 新增 `checkGroupIndex` / `getGroupIndex` / `updateGroupIndex`,写入时携带 `expected_index_etag` 做 CAS,并在冲突后重拉索引重试。
164
+ - 浏览器 IndexedDB TokenStore 新增 `group_index_cache`,按 local AID + group AID 持久化 index JSONL、remote meta、本地 etag、settings cache 和 entry etags。
165
+ - 入口导出 `GROUP_INDEX_KEY`、`GROUP_INDEX_SCHEMA`、`GroupIndexMetaCache`、`buildSignedGroupIndex`、`verifyGroupIndex`、`prepareGroupSettingsWithIndex` 等 group.index API。
166
+
167
+ ### 修复
168
+
169
+ #### 撤回去重与有序投递
170
+ - `message.recalled` 改为专用处理路径,支持 P2P 撤回 tombstone 的有序投递、自动 ack、gap fill 和按原消息标识去重,避免 push / pull 对同一次撤回重复回调。
171
+ - 群撤回去重键改为规范化 group id + 原消息 id/seq,忽略 `recalled_at`,并补齐顶层 recall 字段归一化。
172
+ - 群消息 pull / legacy fallback 识别 `group.message_recalled` tombstone,避免把撤回通知作为普通群消息投递。
173
+ - P2P 与群 push 按 namespace 串行化处理,降低异步解密和投递导致的乱序风险。
174
+ - V2 P2P / Group pull 页内消息按 `seq` 排序后处理,避免服务端返回无序时影响本地 seq 推进。
175
+
176
+ ### 改进
177
+
178
+ - `RPCTransport` 的 `_meta` observer 支持异步回调;RPC 成功响应会等待 observer 完成,事件/通知路径统一走安全的 meta observer 分发。
179
+ - `getAnnouncement` / `getRules` / `getJoinRequirements` 优先使用 group.index settings cache;`updateAnnouncement` / `updateRules` / `updateJoinRequirements` 改走 `updateGroupIndex`,保持索引与设置同步。
180
+ - cross-sdk JS agent 支持 `sdk.update_group_index` 调用,便于跨 SDK 测试索引化群设置。
181
+ - SDK 包版本、运行时 `VERSION` 和 conformance 期望版本更新为 `0.5.3`。
182
+
183
+ ### 测试
184
+
185
+ - 新增 group.index 单元测试,覆盖 hash/etag、签名/验签、settings merge、RPC meta stale/fresh、async meta observer 和 IndexedDB 持久化恢复。
186
+ - 新增 GroupFacade group.index 单元测试,覆盖 CAS 写入、冲突重试、远端索引验签、tamper 拒绝、settings cache 和便利方法索引化写入。
187
+ - 新增浏览器 E2E:验证签名 `group.index` 写入、裸 settings 写入拒绝、CAS 冲突重试和最终 settings 一致性。
188
+ - 扩展撤回投递测试,覆盖 P2P/group recall 顶层字段归一化、push/pull tombstone 去重和有序投递。
189
+ - 更新 group settings 与签名审计 E2E,使公告/群规等索引化 settings 通过 `updateGroupIndex` 写入。
190
+
191
+ ---
192
+
193
+ ## 0.5.2 — 2026-07-05
194
+
195
+ ### 新功能
196
+
197
+ #### agent.md 元数据
198
+ - 支持从 RPC `_meta.agent_md_etags.group` 和 V2 envelope `agent_md.group` 观察群组 agent.md ETag / Last-Modified,并自动维护群 AID 的本地缓存。
199
+ - 群消息 agent.md 观察逻辑补齐 sender / group 两类来源,提升浏览器端跨设备、跨群消息场景下的版本一致性提示能力。
200
+
201
+ ### 修复
202
+
203
+ #### V2 P2P / Group 拉取
204
+ - `message.v2.pull` / `group.v2.pull` 自动 ack 改为通过下一次 pull 的 `ack_up_to_seq` piggyback,减少独立 ack RPC。
205
+ - 修复非满页返回 `has_more=true` 时盲目续拉的问题;满页继续立即拉,非满页仅在有待合并 ack 时追加一页。
206
+ - 过滤 `seq <= after_seq` 的 stale 原始消息,避免重复处理或错误推进 ack。
207
+ - stale 原始页未推进 contiguous seq 时不再发送自动 ack,避免把未真正拉齐的数据误确认。
208
+
209
+ ### 改进
210
+
211
+ - V2 pull 默认/最大 page limit 收敛为 50,并对传入 `limit` 做 1..50 夹取。
212
+ - V2 pull 增加非满页 tail delay:`1000ms / (pulled_messages + 1)`,最大 500ms;满页和空页仍立即结束或续拉。
213
+ - SDK 包版本、运行时 `VERSION` 和 conformance 期望版本更新为 `0.5.2`。
214
+
215
+ ### 测试
216
+
217
+ - 扩展 V2 P2P / Group pull 单元测试,覆盖 `ack_up_to_seq` piggyback、非满页 tail delay、stale 过滤和 max pages flush。
218
+ - 新增 `v2-e2ee-coordinator` 组件边界测试,验证自动 ack 通过下一页 pull piggyback。
219
+ - 扩展 agent.md 和 conformance 测试,覆盖群组 ETag 观察及 0.5.2 版本声明。
220
+
221
+ ---
222
+
223
+ ## 0.5.1 — 2026-07-01
224
+
225
+ ### ⚠️ 重大变更(Breaking Changes)
116
226
 
117
227
  #### 群组标识符统一为 GROUP_AID
118
228
  - **GROUP_ID 废弃**:历史 `group.{domain}/{base}` 格式已废弃,统一为 `{base}.{issuer}` 格式(group_aid)