@agentunion/fastaun-browser 0.5.3 → 0.5.6
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 +130 -56
- 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
- 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
- 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
- package/_packed_docs/CHANGELOG.md +130 -56
- package/_packed_docs/INDEX.md +127 -69
- package/_packed_docs/KITE_DOCS_GUIDE.md +63 -29
- 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
- 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 +227 -0
- 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 +1004 -0
- package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +999 -0
- package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +6 -4
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +58 -20
- package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +219 -247
- package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +14 -14
- package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +3 -3
- 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
- package/_packed_docs/protocol/README.md +1 -0
- package/_packed_docs/protocol/aun-docs-guide.md +7 -4
- package/_packed_docs/protocol/index.md +25 -19
- package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +62 -17
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +22 -0
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +67 -78
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +6 -2
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +87 -41
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +18 -5
- package/_packed_docs/sdk/09-group-rpc-manual.md +307 -267
- package/_packed_docs/sdk/09-message-rpc-manual.md +142 -103
- package/_packed_docs/sdk/09-payload-reference.md +1 -1
- package/_packed_docs/sdk/09-stream-rpc-manual.md +8 -8
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +26 -17
- package/_packed_docs/sdk/INDEX.md +42 -34
- package/_packed_docs/sdk/README.md +7 -6
- 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
- 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
- package/dist/agent-md.d.ts +4 -5
- package/dist/agent-md.d.ts.map +1 -1
- package/dist/agent-md.js +66 -43
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +2 -6
- package/dist/aid-store.d.ts.map +1 -1
- package/dist/aid-store.js +20 -14
- package/dist/aid-store.js.map +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +30 -11
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +3399 -1069
- package/dist/client/delivery.d.ts +75 -8
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js +1419 -245
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/group-state.d.ts.map +1 -1
- package/dist/client/group-state.js +27 -24
- package/dist/client/group-state.js.map +1 -1
- package/dist/client/lifecycle.d.ts.map +1 -1
- package/dist/client/lifecycle.js +48 -4
- package/dist/client/lifecycle.js.map +1 -1
- package/dist/client/mention-mode.d.ts +7 -0
- package/dist/client/mention-mode.d.ts.map +1 -0
- package/dist/client/mention-mode.js +184 -0
- package/dist/client/mention-mode.js.map +1 -0
- package/dist/client/peers.d.ts +1 -1
- package/dist/client/peers.d.ts.map +1 -1
- package/dist/client/peers.js +26 -3
- package/dist/client/peers.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts +22 -1
- package/dist/client/rpc-pipeline.d.ts.map +1 -1
- package/dist/client/rpc-pipeline.js +309 -74
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts +25 -2
- package/dist/client/v2-e2ee.d.ts.map +1 -1
- package/dist/client/v2-e2ee.js +606 -97
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +24 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +404 -215
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +4 -1
- package/dist/errors.js.map +1 -1
- package/dist/facades.d.ts +6 -0
- package/dist/facades.d.ts.map +1 -1
- package/dist/facades.js +199 -104
- package/dist/facades.js.map +1 -1
- package/dist/group-index.d.ts +6 -1
- package/dist/group-index.d.ts.map +1 -1
- package/dist/group-index.js +44 -25
- package/dist/group-index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/keystore/index.d.ts +10 -5
- package/dist/keystore/index.d.ts.map +1 -1
- package/dist/keystore/indexeddb-identity-store.d.ts +0 -12
- package/dist/keystore/indexeddb-identity-store.d.ts.map +1 -1
- package/dist/keystore/indexeddb-identity-store.js +0 -60
- package/dist/keystore/indexeddb-identity-store.js.map +1 -1
- package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
- package/dist/keystore/indexeddb-shared.js +9 -5
- package/dist/keystore/indexeddb-shared.js.map +1 -1
- package/dist/keystore/indexeddb-token-store.d.ts +3 -1
- package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
- package/dist/keystore/indexeddb-token-store.js +47 -2
- package/dist/keystore/indexeddb-token-store.js.map +1 -1
- package/dist/register-flow.d.ts.map +1 -1
- package/dist/register-flow.js +28 -3
- package/dist/register-flow.js.map +1 -1
- package/dist/seq-tracker.d.ts +28 -8
- package/dist/seq-tracker.d.ts.map +1 -1
- package/dist/seq-tracker.js +218 -61
- package/dist/seq-tracker.js.map +1 -1
- package/dist/storage/vfs.d.ts +1 -0
- package/dist/storage/vfs.d.ts.map +1 -1
- package/dist/storage/vfs.js +26 -2
- package/dist/storage/vfs.js.map +1 -1
- package/dist/tools/cross-sdk-agent.js +376 -10
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.d.ts +12 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +218 -101
- package/dist/transport.js.map +1 -1
- package/dist/v2/session/session.d.ts.map +1 -1
- package/dist/v2/session/session.js +3 -4
- package/dist/v2/session/session.js.map +1 -1
- package/dist/v2/state/commitment.d.ts.map +1 -1
- package/dist/v2/state/commitment.js +1 -2
- package/dist/v2/state/commitment.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -5
- package/dist/group-resources.d.ts +0 -98
- package/dist/group-resources.d.ts.map +0 -1
- package/dist/group-resources.js +0 -635
- package/dist/group-resources.js.map +0 -1
- package/dist/keystore/indexeddb.d.ts +0 -179
- package/dist/keystore/indexeddb.d.ts.map +0 -1
- package/dist/keystore/indexeddb.js +0 -2031
- package/dist/keystore/indexeddb.js.map +0 -1
- package/dist/namespaces/auth.d.ts +0 -98
- package/dist/namespaces/auth.d.ts.map +0 -1
- package/dist/namespaces/auth.js +0 -992
- package/dist/namespaces/auth.js.map +0 -1
- package/dist/namespaces/custody.d.ts +0 -51
- package/dist/namespaces/custody.d.ts.map +0 -1
- package/dist/namespaces/custody.js +0 -302
- package/dist/namespaces/custody.js.map +0 -1
- package/dist/namespaces/meta.d.ts +0 -109
- package/dist/namespaces/meta.d.ts.map +0 -1
- package/dist/namespaces/meta.js +0 -549
- package/dist/namespaces/meta.js.map +0 -1
|
@@ -8,23 +8,24 @@
|
|
|
8
8
|
|
|
9
9
|
| 文档 | 说明 |
|
|
10
10
|
|------|------|
|
|
11
|
+
| [CHANGELOG-0.5.6](CHANGELOG-0.5.6.md) | **0.5.6 版本更新日志**:首次签名者回源 · 下载提交前验签 · 消息窗口 · 显式 change-seed · 语言能力边界 |
|
|
11
12
|
| [01-快速开始](01-快速开始.md) | 安装 · 三主体模型 · 最小示例 · 多语言构造 |
|
|
12
|
-
| [02-WebSocket协议](02-WebSocket协议.md) | 握手流程 · JSON-RPC 消息格式 · 裸 WebSocket 示例 |
|
|
13
|
-
| [03-核心概念](03-核心概念.md) | AID · AIDStore · AUNClient ·
|
|
14
|
-
| [04-连接与认证](04-连接与认证.md) | 注册加载 · 认证连接 · 网关发现 · 事件 · agent.md 自动观察 |
|
|
15
|
-
| [05-E2EE加密通信](05-E2EE加密通信.md) | E2EE V2 消息 · ProtectedHeaders · agent.md 版本提示 · recipient wrap |
|
|
13
|
+
| [02-WebSocket协议](02-WebSocket协议.md) | 握手流程 · Capabilities 能力声明 · JSON-RPC 消息格式 · 裸 WebSocket 示例 |
|
|
14
|
+
| [03-核心概念](03-核心概念.md) | AID · AIDStore · AUNClient · A/T/H 消息窗口 · 三 Pull Gate · 九态状态机 · E2EE |
|
|
15
|
+
| [04-连接与认证](04-连接与认证.md) | 注册加载 · 认证连接 · Python Push 自动登记 · 网关发现 · 事件 · agent.md 自动观察 |
|
|
16
|
+
| [05-E2EE加密通信](05-E2EE加密通信.md) | E2EE V2 消息 · ProtectedHeaders · agent.md 版本提示 · recipient wrap |
|
|
16
17
|
| [E2EE_V2消息通信时序图](E2EE_V2消息通信时序图.md) | V2 P2P/GROUP 明文与加密主链路 |
|
|
17
|
-
| [06-API手册](06-API手册.md) | AIDStore · AID · AUNClient ·
|
|
18
|
+
| [06-API手册](06-API手册.md) | AIDStore · AID · AUNClient · Python PushFacade · Message/Group History 门面 · 事件 · E2EE 高级 API · RPC 索引 |
|
|
18
19
|
| [07-错误处理](07-错误处理.md) | Result · 错误类层级 · 错误码 · 重试 |
|
|
19
|
-
| [08-最佳实践](08-最佳实践.md) | 幂等连接 ·
|
|
20
|
+
| [08-最佳实践](08-最佳实践.md) | 幂等连接 · 消息同步/History · Pull Gate · group.index · 测试数据保护 |
|
|
20
21
|
| [09-payload-reference](09-payload-reference.md) | message / group / thought payload 格式 |
|
|
21
|
-
| [09-message-rpc-manual](09-message-rpc-manual.md) | P2P 消息 RPC |
|
|
22
|
-
| [09-group-rpc-manual](09-group-rpc-manual.md) | 群组 RPC(含
|
|
22
|
+
| [09-message-rpc-manual](09-message-rpc-manual.md) | P2P 消息 RPC(含 Forward Pull、`message.history`、Piggy ACK、实时推送内联载荷) |
|
|
23
|
+
| [09-group-rpc-manual](09-group-rpc-manual.md) | 群组 RPC(含 Group Forward 成员可见性 floor、`group.history`、`mention_mode`、`group.index`、`group.fs.*` 和角色 ACL) |
|
|
23
24
|
| [09-storage-rpc-manual](09-storage-rpc-manual.md) | 存储 RPC(对象 + POSIX VFS / 卷 / 软链 / ACL / token) |
|
|
24
25
|
| [09-collab-rpc-manual](09-collab-rpc-manual.md) | 协作 RPC(版本化文档 / 乐观锁 / 三方合并 / 标签 / GC / reflog / revert) |
|
|
25
26
|
| [group.fs POSIX 化详细设计](../aun-fs/group-fs/group.fs-POSIX化详细设计.md) | `client.group.fs.*` / `aun group fs` / `group.fs.*` 群文件系统设计,含群自有区角色 ACL、`parents` 和 JS string 语义 |
|
|
26
27
|
| [group.fs POSIX 化分阶段实施计划](../aun-fs/group-fs/group.fs-POSIX化分阶段实施计划.md) | group.fs 重构的 IPO、Step-by-step、用例集、Checklist、验收和回滚 |
|
|
27
|
-
| [AUN Storage架构设计](
|
|
28
|
+
| [AUN Storage架构设计](<../aun-fs/AUN Storage架构设计.md>) | Storage SDK VFS、控制面/数据面分离、服务端分层、类 Linux 权限、mount/symlink 与关键时序 |
|
|
28
29
|
| [09-meta-rpc-manual](09-meta-rpc-manual.md) | meta RPC 和信任根 |
|
|
29
30
|
| [09-stream-rpc-manual](09-stream-rpc-manual.md) | stream RPC |
|
|
30
31
|
| [09-proxy-rpc-manual](09-proxy-rpc-manual.md) | Service Proxy 控制面 RPC 和数据面隧道注册 |
|
|
@@ -37,10 +38,10 @@
|
|
|
37
38
|
|
|
38
39
|
### 身份与认证
|
|
39
40
|
|
|
40
|
-
- AID 格式、证书、不可变值对象 → [03-核心概念](03-核心概念.md)
|
|
41
|
-
- `AIDStore.register()` / `load()` / `exists()` / `resolve()` → [04-连接与认证](04-连接与认证.md)、[06-API手册](06-API手册.md)
|
|
42
|
-
- agent.md 上传/下载/检查、`remote_etag` / `last_modified` 自动观察、`requester` / `peer` / `group` 角色 → [04-连接与认证](04-连接与认证.md)、[06-API手册](06-API手册.md)、[远程 agent.md 缓存与 ETag 透传方案](../agent.md/远程agent.md缓存与etag透传方案.md)
|
|
43
|
-
- AID 构造约束与多语言入口 → [01-快速开始](01-快速开始.md)、[06-API手册](06-API手册.md)
|
|
41
|
+
- AID 格式、证书、不可变值对象 → [03-核心概念](03-核心概念.md)
|
|
42
|
+
- `AIDStore.register()` / `load()` / `exists()` / `resolve()` → [04-连接与认证](04-连接与认证.md)、[06-API手册](06-API手册.md)
|
|
43
|
+
- agent.md 上传/下载/检查、`remote_etag` / `last_modified` 自动观察、`requester` / `peer` / `group` 角色 → [04-连接与认证](04-连接与认证.md)、[06-API手册](06-API手册.md)、[远程 agent.md 缓存与 ETag 透传方案](../agent.md/远程agent.md缓存与etag透传方案.md)
|
|
44
|
+
- AID 构造约束与多语言入口 → [01-快速开始](01-快速开始.md)、[06-API手册](06-API手册.md)
|
|
44
45
|
- 认证链路和 token → [03-核心概念](03-核心概念.md)、[04-连接与认证](04-连接与认证.md)
|
|
45
46
|
- AID 托管恢复 / 跨设备复制 → [09-custody-api-manual](09-custody-api-manual.md)
|
|
46
47
|
|
|
@@ -49,12 +50,13 @@
|
|
|
49
50
|
- 九态状态机、device_id / slot_id 隔离键 → [03-核心概念](03-核心概念.md)
|
|
50
51
|
- `connect()` 选项、长短连接、网关发现 → [04-连接与认证](04-连接与认证.md)
|
|
51
52
|
- capability getter、事件、生命周期 API → [06-API手册](06-API手册.md)
|
|
53
|
+
- Capabilities 能力声明、`inline_realtime_payload_v1` 实时推送优化 → [02-WebSocket协议](02-WebSocket协议.md)、[CHANGELOG-0.5.6](CHANGELOG-0.5.6.md)
|
|
52
54
|
- 裸 WebSocket 握手 → [02-WebSocket协议](02-WebSocket协议.md)
|
|
53
55
|
|
|
54
56
|
### E2EE
|
|
55
57
|
|
|
56
58
|
- E2EE 原理和默认行为 → [03-核心概念](03-核心概念.md)
|
|
57
|
-
- ProtectedHeaders、agent.md 版本提示边界、V2 recipient wrap、sender_signature / AAD / recipient proof → [05-E2EE加密通信](05-E2EE加密通信.md)
|
|
59
|
+
- ProtectedHeaders、agent.md 版本提示边界、V2 recipient wrap、sender_signature / AAD / recipient proof → [05-E2EE加密通信](05-E2EE加密通信.md)
|
|
58
60
|
- V2 P2P/GROUP 时序 → [E2EE_V2消息通信时序图](E2EE_V2消息通信时序图.md)
|
|
59
61
|
- 高级 E2EE API → [06-API手册](06-API手册.md)
|
|
60
62
|
- 解密失败排查 → [07-错误处理](07-错误处理.md)
|
|
@@ -62,11 +64,13 @@
|
|
|
62
64
|
### RPC 与事件
|
|
63
65
|
|
|
64
66
|
- `client.call()` / `client.on()` → [04-连接与认证](04-连接与认证.md)、[06-API手册](06-API手册.md)
|
|
67
|
+
- Python `connect()` 携带 `push_notify_aid/push_token` 自动登记,以及 `client.push.register/unregister` 运行期变更 → [04-连接与认证](04-连接与认证.md)、[06-API手册](06-API手册.md)、`docs/protocol/15-离线推送通知协议.md`
|
|
65
68
|
- `client.notify()` 在线轻量通知、跨域 federation、在线/离线边界 → [Notify通知方案](Notify通知方案.md)
|
|
66
|
-
-
|
|
67
|
-
-
|
|
69
|
+
- A/T/H 实时窗口、页内唯一有序发布、应用层跨页幂等排序、三 Pull Gate、缺 sender IK 有界同步 bootstrap、永久页内 Gap、坏密文推进 → [03-核心概念](03-核心概念.md)、[05-E2EE加密通信](05-E2EE加密通信.md)、[08-最佳实践](08-最佳实践.md)
|
|
70
|
+
- Message Forward/History/Piggy ACK → [09-message-rpc-manual](09-message-rpc-manual.md)
|
|
71
|
+
- Group Forward/History、群提及过滤 `mention_mode`、`group.index`、群文件系统 `group.fs.*` 和角色 ACL → [09-group-rpc-manual](09-group-rpc-manual.md)
|
|
68
72
|
- 下一版群文件系统 `group.fs.*`、`client.group.fs.*`、`aun group fs`、`cp/mv` POSIX 化语义和 JS string 差异 → [group.fs POSIX 化详细设计](../aun-fs/group-fs/group.fs-POSIX化详细设计.md)、[分阶段实施计划](../aun-fs/group-fs/group.fs-POSIX化分阶段实施计划.md)
|
|
69
|
-
- Storage 架构、SDK VFS、控制面/数据面分离、类 Linux 权限和 mount/symlink → [AUN Storage架构设计](
|
|
73
|
+
- Storage 架构、SDK VFS、控制面/数据面分离、类 Linux 权限和 mount/symlink → [AUN Storage架构设计](<../aun-fs/AUN Storage架构设计.md>)
|
|
70
74
|
- Storage RPC(对象 + `storage.fs.*` / `storage.volume.*` / `storage.fs.touch` / 软链 / ACL / token)→ [09-storage-rpc-manual](09-storage-rpc-manual.md)
|
|
71
75
|
- Collab RPC(`collab.*` 版本化文档、乐观锁、标签、GC、reflog、revert)→ [09-collab-rpc-manual](09-collab-rpc-manual.md)
|
|
72
76
|
- Meta RPC → [09-meta-rpc-manual](09-meta-rpc-manual.md)
|
|
@@ -79,47 +83,51 @@
|
|
|
79
83
|
- Result 与异常层级 → [07-错误处理](07-错误处理.md)
|
|
80
84
|
- 重试策略 → [07-错误处理](07-错误处理.md)
|
|
81
85
|
- 幂等连接、多 AID、资源清理 → [08-最佳实践](08-最佳实践.md)
|
|
82
|
-
- 集成 / E2E 运行顺序 → [../aun测试运行指南.md](../aun测试运行指南.md)
|
|
86
|
+
- 集成 / E2E 运行顺序 → [../aun测试运行指南.md](../aun测试运行指南.md);分布式 worktree 测试 → [../aun分布式测试运行指南.md](../aun分布式测试运行指南.md)
|
|
83
87
|
|
|
84
88
|
---
|
|
85
89
|
|
|
86
90
|
## Layer 3:文档摘要
|
|
87
91
|
|
|
92
|
+
### CHANGELOG-0.5.6
|
|
93
|
+
|
|
94
|
+
以 0.5.5 发布提交为基线,汇总四个 SDK 的首次签名者证书回源、`group.index` / indexed settings / `agent.md` 下载提交前校验、可信缓存读取、消息窗口、inline realtime、mention mode、显式 change-seed,以及 Python、Go、TS 和浏览器 JS 的能力边界。
|
|
95
|
+
|
|
88
96
|
### 01-快速开始
|
|
89
97
|
|
|
90
98
|
说明安装、三主体模型、Python 最小消息收发示例、`AIDStore` / `AID` / `AUNClient` 的职责和 TS/JS/Go 构造约束。
|
|
91
99
|
|
|
92
100
|
### 02-WebSocket协议
|
|
93
101
|
|
|
94
|
-
说明 Gateway WebSocket 握手、JSON-RPC 请求/响应/通知格式,以及裸 WebSocket 客户端如何借助 SDK 完成 token 获取。
|
|
102
|
+
说明 Gateway WebSocket 握手、Capabilities 能力声明(含 `inline_realtime_payload_v1` 实时推送优化)、JSON-RPC 请求/响应/通知格式,以及裸 WebSocket 客户端如何借助 SDK 完成 token 获取。
|
|
103
|
+
|
|
104
|
+
### 03-核心概念
|
|
95
105
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
解释 AID 身份、三主体职责、device_id / slot_id 隔离键、九态状态机、认证挑战-响应、默认 E2EE 行为、RPC/事件模型,以及 `group.index` 的 `_meta.group_indexes` 观察、不同步标记和应用层 pull/push 边界。
|
|
106
|
+
解释 AID 身份、三主体职责、device_id / slot_id 隔离键、A/T/H 实时消息窗口、三 Pull Gate、九态状态机、默认 E2EE 行为和 RPC/事件模型。
|
|
99
107
|
|
|
100
108
|
### 04-连接与认证
|
|
101
109
|
|
|
102
|
-
描述 `AIDStore` 注册加载、`AUNClient`
|
|
110
|
+
描述 `AIDStore` 注册加载、`AUNClient` 身份加载、显式认证、连接选项、Python `connect()` 的 Push 自动登记、长短连接共存、网关发现、agent.md 上传/下载/检查,以及连接后从 Gateway `_meta.agent_md_etags` 和信封 `agent_md` 自动观察远端版本。
|
|
103
111
|
|
|
104
112
|
### 05-E2EE加密通信
|
|
105
113
|
|
|
106
|
-
覆盖默认加密发送、接收自动解密、E2EE V2 多设备 wrap、ProtectedHeaders、agent.md 版本提示与 E2EE 安全边界、`sender_signature` / AAD / recipient proof、群 E2EE 和高级存储扩展边界。
|
|
114
|
+
覆盖默认加密发送、接收自动解密、E2EE V2 多设备 wrap、ProtectedHeaders、agent.md 版本提示与 E2EE 安全边界、`sender_signature` / AAD / recipient proof、群 E2EE 和高级存储扩展边界。
|
|
115
|
+
|
|
116
|
+
### 06-API手册
|
|
117
|
+
|
|
118
|
+
列出 AIDStore、AID、AUNClient、Python PushFacade、Message/Group History 门面、事件、agent.md、ServiceProxyClient、E2EE 高级 API、Group Index facade 和 RPC 手册索引。
|
|
119
|
+
|
|
120
|
+
### 07-错误处理
|
|
107
121
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
列出 AIDStore、AID、AUNClient、事件、agent.md、ServiceProxyClient、E2EE 高级 API、Group Index facade 和 RPC 手册索引,包含 Python / TS / JS / Go 的主要命名差异。
|
|
122
|
+
说明 Result 字典、AUNError 异常层级、错误码映射、重试策略、`group.index etag conflict` CAS 冲突处理和常见错误场景。
|
|
111
123
|
|
|
112
|
-
###
|
|
113
|
-
|
|
114
|
-
说明 Result 字典、AUNError 异常层级、错误码映射、重试策略、`group.index etag conflict` CAS 冲突处理和常见错误场景。
|
|
124
|
+
### 08-最佳实践
|
|
115
125
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
给出幂等加载身份、连接、关闭、多 AID 管理、protected_headers、Flow Control、Group Index 更新流程和测试数据保护建议。
|
|
126
|
+
给出幂等加载身份、连接、关闭、多 AID 管理、Flow Control、A/T/H 实时同步、History 翻页、Piggy ACK、Group Index 更新和测试数据保护建议。
|
|
119
127
|
|
|
120
128
|
### 09-*-rpc-manual
|
|
121
129
|
|
|
122
|
-
各业务服务的 RPC 参数、响应和错误语义。Group RPC 覆盖
|
|
130
|
+
各业务服务的 RPC 参数、响应和错误语义。Message/Group RPC 覆盖 History、Forward/Piggy ACK 和 Group Event 独立游标;SDK 自动最新页同步属于核心概念,不作为应用可调用 RPC 参数;其他手册覆盖 Storage、Collab、Group FS、Service Proxy 等领域。
|
|
123
131
|
|
|
124
132
|
### AUN Storage架构设计
|
|
125
133
|
|
|
@@ -104,22 +104,23 @@ Layer 1: 安全层 TLS + AUN E2EE
|
|
|
104
104
|
| 章节 | 说明 |
|
|
105
105
|
|------|------|
|
|
106
106
|
| [01-快速开始](01-快速开始.md) | 安装、三主体模型、最小示例、多语言构造 |
|
|
107
|
-
| [02-WebSocket协议](02-WebSocket协议.md) |
|
|
107
|
+
| [02-WebSocket协议](02-WebSocket协议.md) | 握手流程、消息格式、Capabilities、裸 WebSocket 示例 |
|
|
108
108
|
| [03-核心概念](03-核心概念.md) | AID、AIDStore、AUNClient、九态状态机、E2EE |
|
|
109
|
-
| [04-连接与认证](04-连接与认证.md) |
|
|
109
|
+
| [04-连接与认证](04-连接与认证.md) | 注册、加载、认证、连接、Python Push 自动登记、事件、agent.md |
|
|
110
110
|
| [05-E2EE加密通信](05-E2EE加密通信.md) | E2EE 收发、ProtectedHeaders、密钥管理 |
|
|
111
|
-
| [06-API手册](06-API手册.md) | AIDStore / AID / AUNClient / ServiceProxyClient / 事件 / RPC 索引 |
|
|
111
|
+
| [06-API手册](06-API手册.md) | AIDStore / AID / AUNClient / Python PushFacade / ServiceProxyClient / 事件 / RPC 索引 |
|
|
112
112
|
| [07-错误处理](07-错误处理.md) | Result、异常层级、错误码、重试策略 |
|
|
113
113
|
| [08-最佳实践](08-最佳实践.md) | 幂等连接、多 AID、资源清理、测试数据保护 |
|
|
114
|
-
| [AUN Storage架构设计](
|
|
114
|
+
| [AUN Storage架构设计](<../aun-fs/AUN Storage架构设计.md>) | Storage SDK VFS、控制面/数据面分离、服务端分层、类 Linux 权限、mount/symlink 和关键时序 |
|
|
115
115
|
| [Notify通知方案](Notify通知方案.md) | `client.notify()` 在线轻量通知、跨域 federation 和可靠消息分工 |
|
|
116
|
+
| [CHANGELOG-0.5.6](CHANGELOG-0.5.6.md) | **0.5.6 版本更新日志**:验签缓存、消息窗口、显式 change-seed 与四语言能力边界 |
|
|
116
117
|
|
|
117
118
|
RPC 专项手册:
|
|
118
119
|
|
|
119
120
|
| 手册 | 范围 |
|
|
120
121
|
|------|------|
|
|
121
122
|
| [09-message-rpc-manual.md](09-message-rpc-manual.md) | P2P 消息、ack、thought |
|
|
122
|
-
| [09-group-rpc-manual.md](09-group-rpc-manual.md) | 群组生命周期、成员、群消息、群 thought、Group FS |
|
|
123
|
+
| [09-group-rpc-manual.md](09-group-rpc-manual.md) | 群组生命周期、成员、群消息、群 thought、Group FS |
|
|
123
124
|
| [09-storage-rpc-manual.md](09-storage-rpc-manual.md) | 对象存储 + POSIX VFS(fs/卷/软链/ACL/token) |
|
|
124
125
|
| [09-collab-rpc-manual.md](09-collab-rpc-manual.md) | 协作层:版本化文档、乐观锁、三方合并、目录快照 |
|
|
125
126
|
| [09-meta-rpc-manual.md](09-meta-rpc-manual.md) | ping / status / trust_roots |
|
|
@@ -128,4 +129,4 @@ RPC 专项手册:
|
|
|
128
129
|
| [09-payload-reference.md](09-payload-reference.md) | message / group payload 结构 |
|
|
129
130
|
| [09-custody-api-manual.md](09-custody-api-manual.md) | 可选 AID 托管 HTTP API |
|
|
130
131
|
|
|
131
|
-
协议文档随 SDK 包分发,位于 `aun_core/docs/protocol/`。
|
|
132
|
+
协议文档随 SDK 包分发,位于 `aun_core/docs/protocol/`。
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# 消息同步与历史拉取代码审查问题清单
|
|
2
|
+
|
|
3
|
+
## 1. 审查结论
|
|
4
|
+
|
|
5
|
+
- 审查基准:`docs/消息同步与历史拉取改造方案.md`。
|
|
6
|
+
- 事实来源:Python/Go 服务端、Gateway、Python/TypeScript/Go/JavaScript SDK 当前工作区代码;方案只作为验收口径,不作为“已实现”的证据。
|
|
7
|
+
- 结论:功能尚未完整;Python/Go 服务端未完全一致,四个 SDK 也未完全一致,并存在多项跨语言共同缺陷。
|
|
8
|
+
- Group 迁移口径:迁移期已经结束,Python `group_inbox` inbox-only 行为是基准;Go Group 继续合并旧表属于待对齐问题。
|
|
9
|
+
- 本清单是静态只读审查结果,未运行服务或测试。优先级按数据永久丢失/跨 Gap ACK、安全与一致性、可恢复性和性能影响排序。
|
|
10
|
+
|
|
11
|
+
## 2. P0:可能永久漏消息或跨 Gap ACK
|
|
12
|
+
|
|
13
|
+
### P0-1 四个 SDK 的 ACK 上界错误地使用 `max_seen/H`,而不是已提交的 `A`
|
|
14
|
+
|
|
15
|
+
Push/Tail 只能证明实时窗口上界,不能证明中间 Gap 已补齐。当前公共 ACK 出口允许调用者把 ACK 提到 `max_seen`,因此 `A=10,T=91,H=100` 时传入 100 会确认尚未补齐的 11..90,服务端随后可回收这些消息。
|
|
16
|
+
|
|
17
|
+
证据:
|
|
18
|
+
|
|
19
|
+
- Python:[delivery.py](../python/src/aun_core/_client/delivery.py#L1111)、[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L1828)
|
|
20
|
+
- TypeScript:[delivery.ts](../ts/src/client/delivery.ts#L1676)
|
|
21
|
+
- Go:[client_delivery.go](../go/client_delivery.go#L1968)
|
|
22
|
+
- JavaScript:[delivery.ts](../js/src/client/delivery.ts#L1641)
|
|
23
|
+
|
|
24
|
+
### P0-2 四个 SDK 混淆 retention floor 与 Group Forward 可见性下界
|
|
25
|
+
|
|
26
|
+
`earliest_available_*`、`join_seq` 和业务可见性边界不代表服务端已物理删除连续前缀,禁止写回或命名为 retention floor。但它们在普通 Group Message/Event Forward 中是当前成员永久不可读前缀的权威证明:`visibility_floor=max(join_seq, earliest_available_*-1)`,A 应推进到 `max(A, retention_floor_*, visibility_floor)`。P2P 只能使用显式 retention floor;Group Tail 也只能独立应用 retention clamp,History 完全不修改 A/T/H。
|
|
27
|
+
|
|
28
|
+
服务端必须保持两个字段族分离:`retention_floor_*` 只表示已提交 GC;Group Forward 的 `earliest_available_*` 则返回 `max(retention_floor, join/epoch visibility floor)+1`。四端消费时取最大值是兼容与防御,不得把成员可见性写入服务端 GC floor。
|
|
29
|
+
|
|
30
|
+
证据:
|
|
31
|
+
|
|
32
|
+
- Python:[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L1290)、[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L3342)
|
|
33
|
+
- TypeScript:[rpc-pipeline.ts](../ts/src/client/rpc-pipeline.ts#L889)、[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L1742)
|
|
34
|
+
- Go:[client_rpc_pipeline.go](../go/client_rpc_pipeline.go#L1242)、[client_rpc_pipeline.go](../go/client_rpc_pipeline.go#L1306)
|
|
35
|
+
- JavaScript:[rpc-pipeline.ts](../js/src/client/rpc-pipeline.ts#L843)、[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L1470)
|
|
36
|
+
|
|
37
|
+
### P0-3 Forward 的提交、持久化和应用交付顺序不能保证崩溃恢复
|
|
38
|
+
|
|
39
|
+
TypeScript、Go、JavaScript 存在先推进 A、后解密/发布的路径;Go 的持久化还由延迟批处理完成。水位落盘后、应用回调前崩溃会令重启从新 A 之后继续,当前页永久不再交付。持久化失败时部分路径只记录日志,仍继续 ACK,也会令服务端状态前移而本地恢复到旧状态。
|
|
40
|
+
|
|
41
|
+
证据:
|
|
42
|
+
|
|
43
|
+
- TypeScript:[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L1073)、[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L1652)
|
|
44
|
+
- Go:[client_v2_e2ee.go](../go/client_v2_e2ee.go#L1412)、[v2_group.go](../go/v2_group.go#L615)、[client_delivery.go](../go/client_delivery.go#L2244)、[v2_routing.go](../go/v2_routing.go#L143)
|
|
45
|
+
- JavaScript:[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L1044)、[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L1388)
|
|
46
|
+
|
|
47
|
+
### P0-4 Python、TypeScript、JavaScript 的 Tail 先提交/ACK,后解密和交付
|
|
48
|
+
|
|
49
|
+
三端先持久化 T/H;窗口与 A 接壤时还会立即 ACK 合并后的 A,之后才逐条解密并发布。ACK 成功后进程崩溃或回调失败,服务端可删除应用从未收到的消息。Go 的对应 Tail 路径没有这一特定顺序差异。
|
|
50
|
+
|
|
51
|
+
证据:
|
|
52
|
+
|
|
53
|
+
- Python:[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L1060)、[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L1120)、[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L3035)
|
|
54
|
+
- TypeScript:[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L960)、[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L972)、[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L1489)
|
|
55
|
+
- JavaScript:[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L951)、[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L963)、[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L1271)
|
|
56
|
+
|
|
57
|
+
### P0-5 四个 SDK 对 Forward 原始页的校验过于宽松
|
|
58
|
+
|
|
59
|
+
非对象、非法 seq、过期 seq 和重复 seq 被静默丢弃;同 seq 内容冲突时保留第一条,而后仍按过滤后的最大 seq 推进 A。Python 的有序 pending 与强制推进组合还可在 `[5,7,6]` 等乱序状态下越过尚未正确交付的 6。服务端损坏、跨源冲突或恶意响应会被转换为“成功扫描”。
|
|
60
|
+
|
|
61
|
+
证据:
|
|
62
|
+
|
|
63
|
+
- Python:[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L64)、[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L1412)
|
|
64
|
+
- TypeScript:[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L63)、[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L1073)
|
|
65
|
+
- Go:[message_window_support.go](../go/message_window_support.go#L123)、[client_v2_e2ee.go](../go/client_v2_e2ee.go#L1333)
|
|
66
|
+
- JavaScript:[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L62)、[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L1044)
|
|
67
|
+
|
|
68
|
+
### P0-6 四个 SDK 缺少身份、slot 与存储 generation 校验
|
|
69
|
+
|
|
70
|
+
Tail/Forward/Gate 异步任务未绑定连接代际。断线重连、切换 AID/device/slot 或更换存储后,旧任务仍可写入共享 SeqTracker,并在执行 ACK 时使用新会话身份。Go 调用链可直接闭合:任务只捕获旧 AID,但 ACK 和持久化读取执行时的当前身份。
|
|
71
|
+
|
|
72
|
+
证据:
|
|
73
|
+
|
|
74
|
+
- Go:[client_rpc_pipeline.go](../go/client_rpc_pipeline.go#L219)、[client_runtime.go](../go/client_runtime.go#L334)、[v2_routing.go](../go/v2_routing.go#L79)、[client_delivery.go](../go/client_delivery.go#L2338)
|
|
75
|
+
- Python:[delivery.py](../python/src/aun_core/_client/delivery.py#L2538)
|
|
76
|
+
- TypeScript:[delivery.ts](../ts/src/client/delivery.ts#L1316)
|
|
77
|
+
- JavaScript:[delivery.ts](../js/src/client/delivery.ts#L1281)
|
|
78
|
+
|
|
79
|
+
### P0-7 Go/TypeScript 的损坏持久化状态可被修复成跨 Gap ACK
|
|
80
|
+
|
|
81
|
+
存储层在交给 SeqTracker 前就把非法窗口折叠到较大值。例如 `A=100,T=-1,H=1000` 可被改成 `A=T=H=1000`,从而确认 101..999。Python 对非法状态失败关闭;JavaScript 按 A 折叠,因此四端恢复语义不一致。
|
|
82
|
+
|
|
83
|
+
证据:
|
|
84
|
+
|
|
85
|
+
- Go:[aid_db.go](../go/keystore/aid_db.go#L489)、[aid_db.go](../go/keystore/aid_db.go#L590)、[seq_tracker.go](../go/seq_tracker.go#L656)
|
|
86
|
+
- TypeScript:[aid-db.ts](../ts/src/keystore/aid-db.ts#L237)
|
|
87
|
+
- Python 基准:[seq_tracker.py](../python/src/aun_core/seq_tracker.py#L487)
|
|
88
|
+
- JavaScript 基准:[seq-tracker.ts](../js/src/seq-tracker.ts#L420)
|
|
89
|
+
|
|
90
|
+
## 3. P1:功能不可用、确定漏读、竞态或严重性能问题
|
|
91
|
+
|
|
92
|
+
### P1-1 Tail/History 反向快照不完整或跨代
|
|
93
|
+
|
|
94
|
+
- Python Message 只查 DB/迁移旧表,遗漏已经成功进入 WAL/pending/recent cache、尚未 flush 的消息;Push 后立即 Tail/History 会漏读并返回滞后的 head。[entry.py](../../extensions/services/message/entry.py#L11203)、[entry.py](../../extensions/services/message/entry.py#L13426)、[db.py](../../extensions/services/message/db.py#L4773)
|
|
95
|
+
- Go Message 在 DB 事务快照建立后才调用 pending lookup,writer 交接窗口可使一条消息既不在事务快照,也不在 pending;Recent 来源也没有纳入反向快照。[tail_history_snapshot.go](../../extensions/services/message/go/internal/store/tail_history_snapshot.go#L118)
|
|
96
|
+
- Python/Go Group 都把 pending freeze 与 DB RR 快照分开。冻结旧正文后再发生 writer 提交与 Recall,旧 pending 可覆盖 DB tombstone,重新返回已撤回正文。[message_store.py](../../extensions/services/group/message_store.py#L3184)、[reverse_messages.go](../../extensions/services/group/go/internal/service/reverse_messages.go#L111)、[reverse_message_snapshot.go](../../extensions/services/group/go/internal/repository/reverse_message_snapshot.go#L58)
|
|
97
|
+
|
|
98
|
+
### P1-2 Python/Go Message 与 Group 的 Tail 都没有证明固定 head/band
|
|
99
|
+
|
|
100
|
+
实现把 head 缩成当前可见物理行的最大 seq,并在首个数值空号处截断。永久空号、设备不可见行或未 flush pending 会缩小 H/W,制造额外 Gap,违反 Tail 固定扫描窗口语义。
|
|
101
|
+
|
|
102
|
+
证据:[Message Python](../../extensions/services/message/db.py#L4926)、[Message Go](../../extensions/services/message/go/internal/store/tail_history_snapshot.go#L215)、[Group Python](../../extensions/services/group/message_store.py#L3325)、[Group Go](../../extensions/services/group/go/internal/repository/reverse_message_snapshot.go#L140)
|
|
103
|
+
|
|
104
|
+
### P1-3 History 终页契约在服务端和四 SDK 间不一致
|
|
105
|
+
|
|
106
|
+
服务端可在 `has_older=false` 时仍返回非空 `next_before_seq`,或返回边界字段为 `null` 的空页;四 SDK 又要求边界成对出现、相等且空页不得带边界,因而拒绝合法终页或产生一次额外翻页。
|
|
107
|
+
|
|
108
|
+
证据:[Python Message](../../extensions/services/message/db.py#L4948)、[Go Message](../../extensions/services/message/go/cmd/message-go/tail_history.go#L206)、[Go Group](../../extensions/services/group/go/internal/service/reverse_messages.go#L209)、[Python SDK](../python/src/aun_core/_client/v2_e2ee.py#L102)、[TypeScript SDK](../ts/src/client/v2-e2ee.ts#L89)、[Go SDK](../go/message_window_support.go#L183)、[JavaScript SDK](../js/src/client/v2-e2ee.ts#L88)
|
|
109
|
+
|
|
110
|
+
### P1-4 Group 在分页之后做业务可见性过滤,会截断 History
|
|
111
|
+
|
|
112
|
+
Python/Go 都先按物理行取 `limit` 并计算分页边界,之后才按 join/epoch/Recall 可见性过滤。最新物理页全不可见、但更老处仍有可见消息时,Python会错误返回 `has_older=false`;Go 会返回空页但 `has_older=true`。两端都没有形成一致、可继续且不漏读的契约。
|
|
113
|
+
|
|
114
|
+
证据:[Python store](../../extensions/services/group/message_store.py#L3353)、[Python service](../../extensions/services/group/service.py#L5596)、[Python entry](../../extensions/services/group/entry.py#L5031)、[Go snapshot](../../extensions/services/group/go/internal/repository/reverse_message_snapshot.go#L173)、[Go filter](../../extensions/services/group/go/internal/service/reverse_messages.go#L158)
|
|
115
|
+
|
|
116
|
+
### P1-5 Python Message 实现了 History,但没有向 Gateway 声明
|
|
117
|
+
|
|
118
|
+
本地 dispatcher 注册了 `history`,生产 `service.attach` 的方法列表却缺失它;Gateway 按能力选择实例时必然返回 `method_not_declared`。因此“有 handler”不等于功能可用,且 Python/Go Message 行为不一致。
|
|
119
|
+
|
|
120
|
+
证据:[entry.py](../../extensions/services/message/entry.py#L4851)、[entry.py](../../extensions/services/message/entry.py#L14718)、[entry.py](../../extensions/services/message/entry.py#L15092)、[service_plane.py](../../extensions/services/gateway/service_plane.py#L383)、[Go 声明](../../extensions/services/message/go/internal/gatewayattach/attach.go#L23)
|
|
121
|
+
|
|
122
|
+
### P1-6 512 KiB 响应上限没有形成硬约束
|
|
123
|
+
|
|
124
|
+
Python Message Tail/History 没有裁剪;已有裁剪函数与 Python/Go Group 都保证至少保留一条,并只累计 message JSON,不含响应外壳。单条合法消息可超过 512 KiB,所以各路径都可能发送超限帧。Tail 裁剪时还必须同步右移 W,当前实现不统一。
|
|
125
|
+
|
|
126
|
+
证据:[Python Message](../../extensions/services/message/entry.py#L529)、[Python Message Tail](../../extensions/services/message/entry.py#L11231)、[Python Message History](../../extensions/services/message/entry.py#L13458)、[Python Group](../../extensions/services/group/entry.py#L5004)、[Go Group](../../extensions/services/group/go/internal/service/reverse_messages.go#L181)
|
|
127
|
+
|
|
128
|
+
### P1-7 四 SDK 的调度、`has_more` 与失败重试不完整
|
|
129
|
+
|
|
130
|
+
四端都主要以“返回条数达到 limit”判断续页,忽略字节裁剪后仍为 `has_more=true` 的非满页,导致 Gap Fill 提前停止。Tail/Forward 失败后没有退避重试;没有后续 Push 时 Gap 可永久停留。
|
|
131
|
+
|
|
132
|
+
证据:[Python](../python/src/aun_core/_client/v2_e2ee.py#L1477)、[TypeScript](../ts/src/client/v2-e2ee.ts#L1183)、[Go](../go/v2_routing.go#L172)、[JavaScript](../js/src/client/v2-e2ee.ts#L1141)、[Go 重试入口](../go/client_delivery.go#L1628)
|
|
133
|
+
|
|
134
|
+
### P1-8 Pull Gate key、长任务占用及 Go 锁反转
|
|
135
|
+
|
|
136
|
+
四端 Gate 折叠 key 未包含完整请求语义,忽略 piggy ACK、device、slot 和外部游标所有权,不同请求可错误共享首请求结果。一次 Gate 还包住最多 100 页 Forward,放大 3 秒旁路并发。Go 另有 `seqTrackerPersistMu -> c.mu` 与 `c.mu -> seqTrackerPersistMu` 的确定性锁顺序反转。
|
|
137
|
+
|
|
138
|
+
证据:[Python key](../python/src/aun_core/_client/rpc_pipeline.py#L481)、[TypeScript key](../ts/src/client/rpc-pipeline.ts#L599)、[Go key](../go/client_rpc_pipeline.go#L858)、[JavaScript key](../js/src/client/rpc-pipeline.ts#L619)、[Go Gate](../go/client_rpc_pipeline.go#L284)、[Go 锁 1](../go/client_delivery.go#L2338)、[Go 锁 2](../go/client_lifecycle.go#L241)
|
|
139
|
+
|
|
140
|
+
### P1-9 Message/Group GC 会被永久 seq 空号卡死
|
|
141
|
+
|
|
142
|
+
序号先分配,后续 WAL/reserve/enqueue 失败不会回滚 allocator,也没有永久洞标记;GC 又只允许 `floor+1` 连续推进。一个空号即可让其后的全部过期消息永久无法删除,floor 永不前移。
|
|
143
|
+
|
|
144
|
+
证据:[Python Group allocator](../../extensions/services/group/message_store.py#L1773)、[Python Group GC](../../extensions/services/group/message_store.py#L1452)、[Go Group allocator](../../extensions/services/group/go/internal/store/plain_pending_sql.go#L87)、[Go Group GC](../../extensions/services/group/go/internal/store/retention_gc.go#L343)
|
|
145
|
+
|
|
146
|
+
### P1-10 WAL/barrier/reservation/cache 存在资源泄漏和失效问题
|
|
147
|
+
|
|
148
|
+
- Python/Go Group 在 WAL append 成功后 fsync/enqueue 失败时不释放 reservation,记录既不进入当前 writer,又永久占用 pending 容量和 GC barrier,重启后还会幽灵回放。[Python plain](../../extensions/services/group/message_store.py#L1850)、[Python queue](../../extensions/services/group/pending_write_queue.py#L269)、[Go plain](../../extensions/services/group/go/internal/store/plain_pending_pipeline.go#L115)、[Go queue](../../extensions/services/group/go/internal/walqueue/queue.go#L468)
|
|
149
|
+
- Go Group Recent V2 body cache 只增不删,GC 后密文仍驻留内存。[recent_v2_cache.go](../../extensions/services/group/go/internal/messages/recent_v2_cache.go#L77)、[retention_gc.go](../../extensions/services/group/go/internal/store/retention_gc.go#L249)
|
|
150
|
+
- Go Group GC 的 `batchSize` 只限制内存计算边界,`FOR UPDATE` 仍可锁定全部候选物理行,形成长事务和 OOM 风险。[retention_gc.go](../../extensions/services/group/go/internal/store/retention_gc.go#L137)、[retention_gc.go](../../extensions/services/group/go/internal/store/retention_gc.go#L303)
|
|
151
|
+
|
|
152
|
+
### P1-11 Python Group 改变了普通 Forward 与 Group Event 的旧语义
|
|
153
|
+
|
|
154
|
+
无 `window_mode` 的普通 Pull 和 Event Pull 把 `cursor.current_seq` 固定成 ACK,不再按已提交 retention floor 更新与持久化;响应字段也发生变化。这违反“旧 Forward/Event 请求、响应、游标行为保持不变”的兼容要求。
|
|
155
|
+
|
|
156
|
+
证据:[普通消息](../../extensions/services/group/service.py#L5801)、[Group Event](../../extensions/services/group/service.py#L12084)
|
|
157
|
+
|
|
158
|
+
### P1-12 Go Message 的 V1 Tail 返回形状走了 V2 转换路径
|
|
159
|
+
|
|
160
|
+
`message.pull` 的 Tail 分支与 V2 共用 snapshot handler,而 handler 固定把行转换成 V2 message 形状;Python 对 V1/V2 分别转换。旧 SDK 调 `message.pull(window_mode=tail)` 时会收到不兼容字段。
|
|
161
|
+
|
|
162
|
+
证据:[Go dispatcher](../../extensions/services/message/go/cmd/message-go/main.go#L4735)、[Go Tail handler](../../extensions/services/message/go/cmd/message-go/tail_history.go#L145)、[Python 分流](../../extensions/services/message/entry.py#L11231)
|
|
163
|
+
|
|
164
|
+
### P1-13 Python、TypeScript、Go 调试日志会泄漏完整消息内容
|
|
165
|
+
|
|
166
|
+
调试路径可记录完整明文或完整密文/envelope,违反日志扫描门禁;JavaScript 未发现同等 `message.debug` 路径,因此四端不一致。
|
|
167
|
+
|
|
168
|
+
证据:[Python](../python/src/aun_core/_client/delivery.py#L798)、[TypeScript](../ts/src/client/delivery.ts#L606)、[Go](../go/client.go#L253)
|
|
169
|
+
|
|
170
|
+
### P1-14 JavaScript History 会触发实时路径副作用
|
|
171
|
+
|
|
172
|
+
History 虽不发布实时事件,但复用了实时解密路径,仍可能更新/调度密钥、会话或补拉相关状态;这违反 History 对实时状态无副作用的要求,并与其他 SDK 不一致。
|
|
173
|
+
|
|
174
|
+
证据:[JavaScript History](../js/src/client/v2-e2ee.ts#L88)、[JavaScript Group 解密路径](../js/src/client/v2-e2ee.ts#L853)
|
|
175
|
+
|
|
176
|
+
## 4. P2:跨语言差异、可观测性和次级性能问题
|
|
177
|
+
|
|
178
|
+
### P2-1 Go Group 必须对齐 Python 的 inbox-only 基准
|
|
179
|
+
|
|
180
|
+
迁移期已结束,新消息只写 `group_inbox`。Python 普通 Forward/Tail/History 以 inbox 结果为权威并禁止后续旧表 fallback;Go 普通 Forward 仍读取、合并 legacy,Tail/History 还硬编码 `IncludeLegacy=true`。残留旧行可填洞、制造 seq 冲突,并导致两服务端返回不同结果。
|
|
181
|
+
|
|
182
|
+
证据:[Go legacy max/query](../../extensions/services/group/go/internal/repository/pull_sql_backend.go#L928)、[Go Forward merge](../../extensions/services/group/go/internal/service/v2_pull.go#L225)、[Go reverse](../../extensions/services/group/go/internal/service/reverse_messages.go#L126)、[Python inbox snapshot](../../extensions/services/group/message_store.py#L3015)、[Python authoritative](../../extensions/services/group/entry.py#L7345)
|
|
183
|
+
|
|
184
|
+
### P2-2 四端在相同 head 的迟到 Tail 上都会右移 T
|
|
185
|
+
|
|
186
|
+
当 `head` 与当前 H 相同、`window_start` 更大时,四端把 T 右移,主动丢弃已有的更宽可靠窗口并扩大 Gap。该规则需要与方案正文统一后再实现,当前四端虽一致,但一致地存在语义风险。
|
|
187
|
+
|
|
188
|
+
证据:[Python](../python/src/aun_core/seq_tracker.py#L146)、[TypeScript](../ts/src/seq-tracker.ts#L127)、[Go](../go/seq_tracker.go#L199)、[JavaScript](../js/src/seq-tracker.ts#L112)
|
|
189
|
+
|
|
190
|
+
### P2-3 Message Tail 的 `server_ack_seq` 恒为 0
|
|
191
|
+
|
|
192
|
+
Python Tail 没有把 slot 传给 snapshot,DB reverse 也不读 ACK;入口对缺失字段默认 0。Go reverse snapshot 同样没有 ACK 来源。不会直接回退本地 A,但冷启动和恢复会产生多余 Forward,且丢失旧 Pull 已有的 ACK 元数据。
|
|
193
|
+
|
|
194
|
+
证据:[Python call](../../extensions/services/message/entry.py#L11203)、[Python response](../../extensions/services/message/entry.py#L11253)、[Go snapshot](../../extensions/services/message/go/internal/store/tail_history_snapshot.go#L153)
|
|
195
|
+
|
|
196
|
+
### P2-4 四 SDK 的 API、Gate、附件和返回结构仍不一致
|
|
197
|
+
|
|
198
|
+
已确认的代表性差异:Go Group History 结果缺 `group_id`;Python Group 明文 Tail/History 丢 `attachments`;Go Group 参数校验接受带空白模式、整数浮点和字符串布尔,而 Python 严格拒绝;部分 Gate 分类及公开 API 返回字段也不同。
|
|
199
|
+
|
|
200
|
+
证据:[Go History](../go/message_window_support.go#L281)、[Python Group 附件转换](../../extensions/services/group/entry.py#L7070)、[Go 参数校验](../../extensions/services/group/go/internal/rpc/message_window_validation.go#L22)、[Python 参数校验](../../extensions/services/group/entry.py#L4950)
|
|
201
|
+
|
|
202
|
+
### P2-5 Gateway proximity、Tail/History 诊断和 LOG-02 尚未完整闭环
|
|
203
|
+
|
|
204
|
+
Python/Go Gateway 已把 History 纳入 session-auth 和能力路由,但 proximity 只装饰实时事件,Tail/History 转发没有能证明边界字段未被改写的成功诊断;Message/Group 服务端日志也缺来源计数、真实 UTF-8 响应字节、裁剪结果、耗时和无副作用确认。发生跨域或裁剪问题时无法仅靠日志还原链路。
|
|
205
|
+
|
|
206
|
+
证据:[Python Gateway auth](../../extensions/services/gateway/relay.py#L536)、[Go Gateway auth](../../extensions/services/gateway/go/internal/httpserver/server.go#L536)、[Go proximity](../../extensions/services/gateway/go/internal/httpserver/server.go#L12115)、[Python Message 日志](../../extensions/services/message/entry.py#L11240)、[Go Message 日志](../../extensions/services/message/go/cmd/message-go/tail_history.go#L166)、[Python Group 日志缺口](../../extensions/services/group/entry.py#L4984)、[Go Group 日志](../../extensions/services/group/go/internal/service/reverse_messages.go#L142)
|
|
207
|
+
|
|
208
|
+
## 5. 横向一致性结论
|
|
209
|
+
|
|
210
|
+
| 对照项 | 结论 |
|
|
211
|
+
| --- | --- |
|
|
212
|
+
| Python Message vs Go Message | 不一致:Python 未声明 History;两端反向快照来源、V1 Tail 形状、终页与诊断行为不同 |
|
|
213
|
+
| Python Group vs Go Group | 不一致:Go 未收口 inbox-only;两端 History 空页、参数校验、GC 批次和缓存行为不同 |
|
|
214
|
+
| 四 SDK 状态机 | 不一致,且 ACK 上界、非权威 floor、Forward 校验、generation、`has_more` 等存在共同缺陷 |
|
|
215
|
+
| Python vs TypeScript vs JavaScript | TypeScript/JavaScript 结构接近但持久化等待、History 副作用和部分返回语义不同 |
|
|
216
|
+
| Go SDK vs 其他 SDK | 另有锁反转、损坏状态修复、群并行解密与签名失败后 ACK 等特有问题 |
|
|
217
|
+
|
|
218
|
+
## 6. 修复顺序
|
|
219
|
+
|
|
220
|
+
1. 先冻结并修复全部 P0:ACK 只能到 A;只有权威 retention floor 能推进 A;提交、持久化、交付、ACK 按崩溃安全顺序重排;所有任务增加 generation。
|
|
221
|
+
2. 再修服务端可靠窗口与快照:固定 head/band、合并完整来源、统一 History 终页和 Group 可见性分页。
|
|
222
|
+
3. 然后修 Gate、`has_more`、重试、GC/WAL/cache 与 512 KiB 硬上限。
|
|
223
|
+
4. 最后收口跨语言差异和 LOG-02;其中 Go Group inbox-only 对齐 Python 是明确口径,不再保留迁移期兼容分支。
|
|
224
|
+
|
|
225
|
+
## 7. 已排除的误报
|
|
226
|
+
|
|
227
|
+
- Python Group Tail/History 已由外层统一 federation 路由覆盖,不存在跨域路由缺失。
|
|
228
|
+
- Python Group inbox-only 是迁移完成后的正确基准,不是缺陷;缺陷是 Go Group 尚未对齐。
|
|
229
|
+
- Python Group Tail/History 已执行 512 KiB 裁剪;问题是该裁剪不是硬上限,而不是“完全没有裁剪”。
|