@agentunion/fastaun-browser 0.3.2 → 0.3.4
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 +45 -0
- package/_packed_docs/CHANGELOG.md +45 -0
- package/_packed_docs/INDEX.md +81 -0
- package/_packed_docs/KITE_DOCS_GUIDE.md +55 -0
- 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 +328 -0
- package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +686 -0
- 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 -0
- 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 -0
- package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +5 -5
- package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +1 -1
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +2 -2
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +454 -396
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +1410 -1244
- package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +19 -1
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +20 -5
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +6 -4
- 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 -0
- package/_packed_docs/sdk/INDEX.md +9 -4
- package/_packed_docs/sdk/README.md +3 -3
- package/dist/auth.d.ts +10 -11
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +128 -95
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +2658 -816
- package/dist/client.d.ts +73 -7
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1586 -494
- package/dist/client.js.map +1 -1
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +45 -31
- package/dist/crypto.js.map +1 -1
- package/dist/discovery.d.ts +4 -0
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +16 -11
- package/dist/discovery.js.map +1 -1
- package/dist/errors.d.ts +4 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +7 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/keystore/index.d.ts +27 -0
- package/dist/keystore/index.d.ts.map +1 -1
- package/dist/keystore/indexeddb.d.ts +16 -1
- package/dist/keystore/indexeddb.d.ts.map +1 -1
- package/dist/keystore/indexeddb.js +168 -7
- package/dist/keystore/indexeddb.js.map +1 -1
- package/dist/logger.d.ts +5 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +8 -2
- package/dist/logger.js.map +1 -1
- package/dist/namespaces/auth.d.ts +4 -3
- package/dist/namespaces/auth.d.ts.map +1 -1
- package/dist/namespaces/auth.js +77 -20
- package/dist/namespaces/auth.js.map +1 -1
- package/dist/secret-store/indexeddb-store.js +1 -1
- package/dist/secret-store/indexeddb-store.js.map +1 -1
- package/dist/seq-tracker.d.ts +5 -3
- package/dist/seq-tracker.d.ts.map +1 -1
- package/dist/seq-tracker.js +30 -3
- package/dist/seq-tracker.js.map +1 -1
- package/dist/transport.d.ts +9 -1
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +176 -64
- package/dist/transport.js.map +1 -1
- package/dist/v2/crypto/canonical.d.ts +1 -1
- package/dist/v2/crypto/canonical.d.ts.map +1 -1
- package/dist/v2/crypto/canonical.js +42 -13
- package/dist/v2/crypto/canonical.js.map +1 -1
- package/dist/v2/crypto/ecdh.d.ts.map +1 -1
- package/dist/v2/crypto/ecdh.js +18 -1
- package/dist/v2/crypto/ecdh.js.map +1 -1
- package/dist/v2/e2ee/decrypt.d.ts.map +1 -1
- package/dist/v2/e2ee/decrypt.js +57 -3
- package/dist/v2/e2ee/decrypt.js.map +1 -1
- package/dist/v2/e2ee/encrypt-group.d.ts.map +1 -1
- package/dist/v2/e2ee/encrypt-group.js +16 -6
- package/dist/v2/e2ee/encrypt-group.js.map +1 -1
- package/dist/v2/e2ee/encrypt-p2p.d.ts.map +1 -1
- package/dist/v2/e2ee/encrypt-p2p.js +40 -11
- package/dist/v2/e2ee/encrypt-p2p.js.map +1 -1
- package/dist/v2/e2ee/metadata-auth.d.ts +1 -0
- package/dist/v2/e2ee/metadata-auth.d.ts.map +1 -1
- package/dist/v2/e2ee/metadata-auth.js +51 -0
- package/dist/v2/e2ee/metadata-auth.js.map +1 -1
- package/dist/v2/e2ee/types.d.ts +2 -2
- package/dist/v2/e2ee/types.d.ts.map +1 -1
- package/dist/v2/session/keystore.d.ts +12 -4
- package/dist/v2/session/keystore.d.ts.map +1 -1
- package/dist/v2/session/keystore.js +177 -35
- package/dist/v2/session/keystore.js.map +1 -1
- package/dist/v2/session/session.d.ts +11 -3
- package/dist/v2/session/session.d.ts.map +1 -1
- package/dist/v2/session/session.js +97 -17
- 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 +4 -1
- package/dist/v2/state/commitment.js.map +1 -1
- package/package.json +43 -43
- package/dist/e2ee-group.d.ts +0 -276
- package/dist/e2ee-group.d.ts.map +0 -1
- package/dist/e2ee-group.js +0 -1653
- package/dist/e2ee-group.js.map +0 -1
|
@@ -0,0 +1,665 @@
|
|
|
1
|
+
# 跨语言容器 E2E 测试方案
|
|
2
|
+
|
|
3
|
+
本文档定义 AUN 多语言 SDK 在 Docker 环境中进行跨语言集成 / E2E 测试的目标拓扑、控制协议、测试矩阵和落地顺序。重点覆盖 Python SDK 与 TypeScript SDK 的互通测试,并为 Go、C++、浏览器 JavaScript 后续接入预留一致模型。
|
|
4
|
+
|
|
5
|
+
## 背景
|
|
6
|
+
|
|
7
|
+
当前各语言 SDK 已有各自的单元测试、集成测试和部分 E2E 测试,但“各自通过”不能证明跨语言真实互通稳定。尤其是 E2EE、消息 envelope、canonical JSON、设备密钥、群组 epoch、ack cursor、跨域 routing 等能力,容易出现某个 SDK 自测通过、组合运行失败的问题。
|
|
8
|
+
|
|
9
|
+
问题的根源通常不是某个 SDK 单点逻辑,而是多语言实现之间存在细微协议差异:
|
|
10
|
+
|
|
11
|
+
- 同一字段是否参与签名、加密 AAD 或 digest 计算。
|
|
12
|
+
- JSON canonical 序列化、字段排序、空值处理、base64 padding 是否一致。
|
|
13
|
+
- E2EE key id、recipient、device id、slot id、message id 是否一致。
|
|
14
|
+
- 服务端返回错误码、部分成功语义、ack 推进语义是否被各语言一致处理。
|
|
15
|
+
- 跨域时 issuer、domain、gateway discovery、federation envelope 绑定是否一致。
|
|
16
|
+
|
|
17
|
+
因此需要建立一套独立于任意单一 SDK 的跨语言测试体系,让多个语言客户端在同一个 Docker 网络内真实连接 AUN 服务端,并由统一 test-runner 编排用例、收集日志、判断结果。
|
|
18
|
+
|
|
19
|
+
## 目标
|
|
20
|
+
|
|
21
|
+
- 优先覆盖 Python <-> TypeScript 的单域互通。
|
|
22
|
+
- 在同一 Docker network 中同时启动不同语言 SDK 客户端实例。
|
|
23
|
+
- 所有客户端连接同一 AUN server / gateway,通过 AUN 服务端路由业务消息。
|
|
24
|
+
- test-runner 只负责编排和断言,不 import 任意语言 SDK。
|
|
25
|
+
- 各语言客户端暴露一致的测试控制面,便于 test-runner 跨语言控制。
|
|
26
|
+
- 每个失败用例都能定位到协议一致性、客户端运行时、服务端路由或跨域 federation 层。
|
|
27
|
+
- 浏览器 JavaScript E2E 与 Node/TS 容器 E2E 分层,不把浏览器环境问题混入第一优先级的跨语言主路径。
|
|
28
|
+
|
|
29
|
+
## 非目标
|
|
30
|
+
|
|
31
|
+
- 不把测试控制协议设计成正式业务 API。
|
|
32
|
+
- 不要求所有语言 SDK 共用任何代码、配置文件或本地数据库。
|
|
33
|
+
- 不把 test-runner 变成某个 SDK 的上层封装。
|
|
34
|
+
- 不在首阶段覆盖完整产品级 CLI 功能。
|
|
35
|
+
- 不在容器 test-runner 中挂载 Docker socket 后使用 `docker exec` 控制其他容器。
|
|
36
|
+
|
|
37
|
+
## 总体拓扑
|
|
38
|
+
|
|
39
|
+
单域跨语言 E2E 的目标拓扑:
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
docker network: kite-net
|
|
43
|
+
├── aun-server / gateway
|
|
44
|
+
├── python-client
|
|
45
|
+
│ ├── Python SDK agent 长连接
|
|
46
|
+
│ └── test-control HTTP
|
|
47
|
+
├── ts-client
|
|
48
|
+
│ ├── TypeScript SDK agent 长连接
|
|
49
|
+
│ └── test-control HTTP
|
|
50
|
+
└── test-runner
|
|
51
|
+
└── 通过 HTTP 控制各语言 client
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
业务消息面:
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
python-client -> AUN gateway -> ts-client
|
|
58
|
+
ts-client -> AUN gateway -> python-client
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
测试控制面:
|
|
62
|
+
|
|
63
|
+
```text
|
|
64
|
+
test-runner -> python-client:test-control
|
|
65
|
+
test-runner -> ts-client:test-control
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
日志与产物面:
|
|
69
|
+
|
|
70
|
+
```text
|
|
71
|
+
python-client -> /artifacts/logs/python
|
|
72
|
+
ts-client -> /artifacts/logs/ts
|
|
73
|
+
test-runner -> /artifacts/results
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
关键原则:客户端之间不通过测试 HTTP 接口传业务消息。测试 HTTP 只用于“让某个客户端执行动作”和“查询某个客户端观察到的结果”。真实消息必须走 AUN server / gateway。
|
|
77
|
+
|
|
78
|
+
## 分层测试模型
|
|
79
|
+
|
|
80
|
+
跨语言测试按四层推进,避免所有问题都落到难调的大 E2E。
|
|
81
|
+
|
|
82
|
+
### 第一层:共享测试向量
|
|
83
|
+
|
|
84
|
+
每个 SDK 读取同一批 JSON / JSONL fixture,验证 E2EE 原语、canonical bytes、签名、加密 envelope 和非法包拒绝行为。fixture 是共享数据,不是共享代码。
|
|
85
|
+
|
|
86
|
+
覆盖内容:
|
|
87
|
+
|
|
88
|
+
- 固定 identity key、prekey、recipient、nonce、salt、message id。
|
|
89
|
+
- canonical JSON bytes hash。
|
|
90
|
+
- AAD hash。
|
|
91
|
+
- ciphertext hash。
|
|
92
|
+
- signature hash。
|
|
93
|
+
- 成功解密结果。
|
|
94
|
+
- 篡改密文、篡改 tag、错误 recipient、错误 signer、重放消息等反例。
|
|
95
|
+
|
|
96
|
+
失败定位:
|
|
97
|
+
|
|
98
|
+
- 这一层失败,优先查密码学原语、序列化、字段排序、base64、签名输入、AAD 输入。
|
|
99
|
+
|
|
100
|
+
### 第二层:CLI / transcript 互通
|
|
101
|
+
|
|
102
|
+
Python CLI 和 TS 测试 CLI 读取同一 transcript 或 fixture 文件,互相生成和验证 envelope。此层可以通过共享 volume 交换文件,不要求启动长连接 agent。
|
|
103
|
+
|
|
104
|
+
示例流程:
|
|
105
|
+
|
|
106
|
+
```text
|
|
107
|
+
python-cli 生成 encrypted envelope -> /work/py-to-ts.json
|
|
108
|
+
ts-cli 读取并解密 /work/py-to-ts.json
|
|
109
|
+
ts-cli 生成 encrypted envelope -> /work/ts-to-py.json
|
|
110
|
+
python-cli 读取并解密 /work/ts-to-py.json
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
失败定位:
|
|
114
|
+
|
|
115
|
+
- 这一层失败,优先查 SDK 本地实现和 CLI JSON 输入输出,不查服务端。
|
|
116
|
+
|
|
117
|
+
### 第三层:单域真实客户端 E2E
|
|
118
|
+
|
|
119
|
+
每个语言客户端以长连接方式登录到同一 AUN gateway,test-runner 通过测试控制面触发发送、轮询收件箱、断言解密结果。
|
|
120
|
+
|
|
121
|
+
示例流程:
|
|
122
|
+
|
|
123
|
+
```text
|
|
124
|
+
test-runner -> python-client /send(to=ts-agent, e2ee=true)
|
|
125
|
+
python-client -> AUN gateway -> ts-client
|
|
126
|
+
test-runner -> ts-client /inbox(trace_id=case-001)
|
|
127
|
+
test-runner 断言 received=true, decrypted=true, text=expected
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
失败定位:
|
|
131
|
+
|
|
132
|
+
- 第一、二层通过但这一层失败,优先查连接状态、gateway discovery、消息 RPC、push/pull、ack、SDK 后台任务、日志 trace。
|
|
133
|
+
|
|
134
|
+
### 第四层:双域 federation E2E
|
|
135
|
+
|
|
136
|
+
在 `docker-deploy/federation-test` 中启动两个 issuer 域,分别运行不同语言客户端,验证跨域消息和 E2EE。
|
|
137
|
+
|
|
138
|
+
示例流程:
|
|
139
|
+
|
|
140
|
+
```text
|
|
141
|
+
python-client-aid.com -> kite-a -> federation -> kite-b -> ts-client-aid.net
|
|
142
|
+
ts-client-aid.net -> kite-b -> federation -> kite-a -> python-client-aid.com
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
失败定位:
|
|
146
|
+
|
|
147
|
+
- 前三层通过但这一层失败,优先查 issuer 绑定、well-known gateway discovery、federation envelope、远端证书链、跨域路由和跨域 AAD 字段。
|
|
148
|
+
|
|
149
|
+
## test-runner 控制方式
|
|
150
|
+
|
|
151
|
+
test-runner 不直接执行某个语言 SDK,也不通过 Docker socket 控制容器。它只调用每个客户端容器暴露的统一测试控制面。
|
|
152
|
+
|
|
153
|
+
推荐每个语言 client 容器启动两个逻辑组件:
|
|
154
|
+
|
|
155
|
+
- SDK agent:使用本语言 SDK 连接 AUN gateway,负责真实收发消息。
|
|
156
|
+
- test-control:仅测试环境启用的 HTTP 服务,负责接收 test-runner 命令并查询 agent 状态。
|
|
157
|
+
|
|
158
|
+
test-control 与 SDK agent 可以在同一进程内实现,也可以是同容器内的两个进程。首阶段建议同进程实现,降低生命周期协调成本。
|
|
159
|
+
|
|
160
|
+
## 测试控制面 API
|
|
161
|
+
|
|
162
|
+
所有语言客户端实现同一套最小 HTTP API。端口建议统一为 `9001`,容器内监听 `0.0.0.0:9001`。
|
|
163
|
+
|
|
164
|
+
### `GET /health`
|
|
165
|
+
|
|
166
|
+
返回客户端测试控制面和 SDK agent 是否就绪。
|
|
167
|
+
|
|
168
|
+
响应字段:
|
|
169
|
+
|
|
170
|
+
| 字段 | 类型 | 说明 |
|
|
171
|
+
| --- | --- | --- |
|
|
172
|
+
| `ok` | bool | test-control 是否可用 |
|
|
173
|
+
| `agent_ready` | bool | SDK agent 是否已完成认证和连接 |
|
|
174
|
+
| `aid` | string | 当前客户端 AID |
|
|
175
|
+
| `language` | string | `python` / `ts` / `go` / `cpp` |
|
|
176
|
+
| `sdk_version` | string | SDK 版本 |
|
|
177
|
+
| `gateway_url` | string | 实际连接的 gateway |
|
|
178
|
+
|
|
179
|
+
### `POST /reset`
|
|
180
|
+
|
|
181
|
+
清理本轮测试的内存收件箱、trace 缓存和临时状态。默认不删除 AID 身份材料、本地密钥、数据库和持久化状态。
|
|
182
|
+
|
|
183
|
+
请求字段:
|
|
184
|
+
|
|
185
|
+
| 字段 | 类型 | 说明 |
|
|
186
|
+
| --- | --- | --- |
|
|
187
|
+
| `scope` | string | `case` / `session`,默认 `case` |
|
|
188
|
+
| `trace_id` | string | 可选,仅清理某条 trace |
|
|
189
|
+
|
|
190
|
+
### `GET /identity`
|
|
191
|
+
|
|
192
|
+
返回当前客户端身份和设备信息。
|
|
193
|
+
|
|
194
|
+
响应字段:
|
|
195
|
+
|
|
196
|
+
| 字段 | 类型 | 说明 |
|
|
197
|
+
| --- | --- | --- |
|
|
198
|
+
| `aid` | string | 当前 AID |
|
|
199
|
+
| `device_id` | string | 当前设备 ID |
|
|
200
|
+
| `slot_id` | string | 当前 slot ID |
|
|
201
|
+
| `issuer` | string | issuer 域 |
|
|
202
|
+
| `public_key_fingerprint` | string | 公钥指纹,不返回私钥 |
|
|
203
|
+
|
|
204
|
+
### `POST /send`
|
|
205
|
+
|
|
206
|
+
触发本客户端通过 AUN 发送消息。
|
|
207
|
+
|
|
208
|
+
请求字段:
|
|
209
|
+
|
|
210
|
+
| 字段 | 类型 | 说明 |
|
|
211
|
+
| --- | --- | --- |
|
|
212
|
+
| `to` | string | 目标 AID 或 agent id |
|
|
213
|
+
| `text` | string | 测试文本 |
|
|
214
|
+
| `e2ee` | bool | 是否启用 E2EE |
|
|
215
|
+
| `trace_id` | string | 用例 trace id |
|
|
216
|
+
| `message_id` | string | 可选,外部指定消息 ID |
|
|
217
|
+
| `timeout_ms` | number | 单次发送超时 |
|
|
218
|
+
|
|
219
|
+
响应字段:
|
|
220
|
+
|
|
221
|
+
| 字段 | 类型 | 说明 |
|
|
222
|
+
| --- | --- | --- |
|
|
223
|
+
| `ok` | bool | 发送动作是否完成 |
|
|
224
|
+
| `trace_id` | string | trace id |
|
|
225
|
+
| `message_id` | string | 实际消息 ID |
|
|
226
|
+
| `seq` | number | 如服务端返回 seq,则记录 |
|
|
227
|
+
| `encrypted` | bool | 是否按 E2EE 发送 |
|
|
228
|
+
| `error_code` | string | 失败时返回 |
|
|
229
|
+
| `error_message` | string | 失败时返回 |
|
|
230
|
+
|
|
231
|
+
### `GET /inbox`
|
|
232
|
+
|
|
233
|
+
查询本客户端已观察到的消息。test-runner 应按 `trace_id` 轮询,直到命中或超时。
|
|
234
|
+
|
|
235
|
+
查询参数:
|
|
236
|
+
|
|
237
|
+
| 参数 | 说明 |
|
|
238
|
+
| --- | --- |
|
|
239
|
+
| `trace_id` | 按 trace 过滤 |
|
|
240
|
+
| `from` | 可选,按发送方过滤 |
|
|
241
|
+
| `limit` | 返回数量,默认 20 |
|
|
242
|
+
|
|
243
|
+
响应字段:
|
|
244
|
+
|
|
245
|
+
| 字段 | 类型 | 说明 |
|
|
246
|
+
| --- | --- | --- |
|
|
247
|
+
| `items` | array | 消息列表 |
|
|
248
|
+
| `received` | bool | 是否有匹配消息 |
|
|
249
|
+
|
|
250
|
+
消息项字段:
|
|
251
|
+
|
|
252
|
+
| 字段 | 类型 | 说明 |
|
|
253
|
+
| --- | --- | --- |
|
|
254
|
+
| `trace_id` | string | trace id |
|
|
255
|
+
| `message_id` | string | message id |
|
|
256
|
+
| `from` | string | 发送方 |
|
|
257
|
+
| `to` | string | 接收方 |
|
|
258
|
+
| `text` | string | 解密后的测试文本;仅测试消息可返回 |
|
|
259
|
+
| `decrypted` | bool | 是否成功解密 |
|
|
260
|
+
| `encrypted` | bool | 原消息是否加密 |
|
|
261
|
+
| `seq` | number | 消息 seq |
|
|
262
|
+
| `ack_seq` | number | 当前 ack seq |
|
|
263
|
+
| `error_code` | string | 解密或处理失败时返回 |
|
|
264
|
+
|
|
265
|
+
### `GET /traces/{trace_id}`
|
|
266
|
+
|
|
267
|
+
返回本客户端与该 trace 相关的安全诊断字段。
|
|
268
|
+
|
|
269
|
+
允许字段:
|
|
270
|
+
|
|
271
|
+
- `trace_id`
|
|
272
|
+
- `session_id`
|
|
273
|
+
- `message_id`
|
|
274
|
+
- `key_id`
|
|
275
|
+
- `sender`
|
|
276
|
+
- `recipient`
|
|
277
|
+
- `device_id`
|
|
278
|
+
- `slot_id`
|
|
279
|
+
- `aad_sha256`
|
|
280
|
+
- `canonical_sha256`
|
|
281
|
+
- `ciphertext_sha256`
|
|
282
|
+
- `public_key_fingerprint`
|
|
283
|
+
- `nonce`
|
|
284
|
+
- `stage`
|
|
285
|
+
- `error_code`
|
|
286
|
+
|
|
287
|
+
禁止字段:
|
|
288
|
+
|
|
289
|
+
- 私钥
|
|
290
|
+
- 明文会话密钥
|
|
291
|
+
- 原始明文
|
|
292
|
+
- token
|
|
293
|
+
- 完整证书私密材料
|
|
294
|
+
- 可复用认证凭证
|
|
295
|
+
|
|
296
|
+
### `GET /logs`
|
|
297
|
+
|
|
298
|
+
返回测试相关日志的元信息或尾部片段。正式日志仍以 volume 产物为准。
|
|
299
|
+
|
|
300
|
+
响应字段:
|
|
301
|
+
|
|
302
|
+
| 字段 | 类型 | 说明 |
|
|
303
|
+
| --- | --- | --- |
|
|
304
|
+
| `log_files` | array | 日志文件路径列表 |
|
|
305
|
+
| `tail` | array | 可选尾部日志行 |
|
|
306
|
+
|
|
307
|
+
## 客户端容器要求
|
|
308
|
+
|
|
309
|
+
每个语言客户端容器必须满足以下要求:
|
|
310
|
+
|
|
311
|
+
- 使用独立 `AUN_DATA_ROOT` / `aun_path`,避免不同语言共用 SQLite、SQLCipher 或本地密钥数据库。
|
|
312
|
+
- 使用固定或可预期的 AID,便于 test-runner 建立发送矩阵。
|
|
313
|
+
- 启动后自动完成身份准备、认证、连接 gateway、订阅消息事件。
|
|
314
|
+
- 通过 test-control 暴露 readiness,而不是只依赖容器启动成功。
|
|
315
|
+
- 日志输出同时进入控制台和挂载目录,便于 CI 收集。
|
|
316
|
+
- 所有测试控制响应使用 JSON,失败时返回稳定 `error_code`。
|
|
317
|
+
- 退出码只用于进程级失败,不用于单条测试断言。
|
|
318
|
+
|
|
319
|
+
Python 当前已有 CLI 入口 `aun`,可优先补 `test-agent` 或独立测试控制进程。TypeScript 当前主要是 SDK + Vitest 测试,建议新增最小测试 CLI / test-agent,用于容器内长连接和 HTTP 控制面。
|
|
320
|
+
|
|
321
|
+
建议 TS 测试 CLI 先实现测试能力,不追求产品级完整 CLI:
|
|
322
|
+
|
|
323
|
+
```text
|
|
324
|
+
aun-ts test-agent --aid <aid> --gateway <url> --control-port 9001
|
|
325
|
+
aun-ts e2ee encrypt --fixture <file> --json
|
|
326
|
+
aun-ts e2ee decrypt --fixture <file> --json
|
|
327
|
+
aun-ts trace replay <transcript.jsonl> --json
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
## Docker Compose 设计
|
|
331
|
+
|
|
332
|
+
### 单域建议结构
|
|
333
|
+
|
|
334
|
+
在现有 `docker-deploy` 单域环境中,可新增一组跨语言 client 与 test-runner 服务。现有服务名包括:
|
|
335
|
+
|
|
336
|
+
- `kite` / `kite-app`:AUN 服务端。
|
|
337
|
+
- `sdk-tester` / `kite-sdk-tester`:Python 测试容器。
|
|
338
|
+
- `ts-tester` / `kite-ts-tester`:TypeScript 测试容器。
|
|
339
|
+
- `go-tester` / `kite-go-tester`:Go 测试容器。
|
|
340
|
+
|
|
341
|
+
跨语言 E2E 不建议直接复用“sleep infinity + docker exec”的模式作为最终形态,而是新增专门服务:
|
|
342
|
+
|
|
343
|
+
```yaml
|
|
344
|
+
services:
|
|
345
|
+
cross-python-client:
|
|
346
|
+
image: aun-sdk-tester:latest
|
|
347
|
+
command: aun-test-agent-python --control-port 9001
|
|
348
|
+
environment:
|
|
349
|
+
AUN_DATA_ROOT: /data/aun
|
|
350
|
+
AUN_TEST_AID: py-agent.agentid.pub
|
|
351
|
+
AUN_GATEWAY_URL: wss://gateway.agentid.pub:20001/aun
|
|
352
|
+
volumes:
|
|
353
|
+
- ./data/cross-sdk/python:/data/aun
|
|
354
|
+
- ./data/cross-sdk/logs/python:/root/.aun/logs
|
|
355
|
+
networks:
|
|
356
|
+
- kite-net
|
|
357
|
+
|
|
358
|
+
cross-ts-client:
|
|
359
|
+
image: node:22-bookworm
|
|
360
|
+
command: bash -lc "cd /workspace/ts && npm run test-agent -- --control-port 9001"
|
|
361
|
+
environment:
|
|
362
|
+
AUN_DATA_ROOT: /data/aun
|
|
363
|
+
AUN_TEST_AID: ts-agent.agentid.pub
|
|
364
|
+
AUN_GATEWAY_URL: wss://gateway.agentid.pub:20001/aun
|
|
365
|
+
volumes:
|
|
366
|
+
- ../aun-sdk-core/ts:/workspace/ts
|
|
367
|
+
- cross-ts-node-modules:/workspace/ts/node_modules
|
|
368
|
+
- ./data/cross-sdk/ts:/data/aun
|
|
369
|
+
- ./data/cross-sdk/logs/ts:/root/.aun/logs
|
|
370
|
+
networks:
|
|
371
|
+
- kite-net
|
|
372
|
+
|
|
373
|
+
cross-sdk-runner:
|
|
374
|
+
image: aun-sdk-tester:latest
|
|
375
|
+
command: python /runner/run_cross_sdk_e2e.py
|
|
376
|
+
environment:
|
|
377
|
+
PY_CLIENT_URL: http://cross-python-client:9001
|
|
378
|
+
TS_CLIENT_URL: http://cross-ts-client:9001
|
|
379
|
+
ARTIFACT_DIR: /artifacts
|
|
380
|
+
volumes:
|
|
381
|
+
- ../aun-sdk-core/tests/cross-sdk:/runner:ro
|
|
382
|
+
- ./data/cross-sdk/artifacts:/artifacts
|
|
383
|
+
networks:
|
|
384
|
+
- kite-net
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
这只是目标结构示例,实际落地时可以拆成 `docker-compose.cross-sdk.yml`,避免影响现有常规测试环境。
|
|
388
|
+
|
|
389
|
+
### 双域建议结构
|
|
390
|
+
|
|
391
|
+
在 `docker-deploy/federation-test` 中保持两个服务端域:
|
|
392
|
+
|
|
393
|
+
- `kite-a`:issuer `aid.com`
|
|
394
|
+
- `kite-b`:issuer `aid.net`
|
|
395
|
+
|
|
396
|
+
新增跨语言客户端:
|
|
397
|
+
|
|
398
|
+
```text
|
|
399
|
+
cross-python-client-a -> aid.com
|
|
400
|
+
cross-ts-client-b -> aid.net
|
|
401
|
+
cross-sdk-federation-runner
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
测试流:
|
|
405
|
+
|
|
406
|
+
```text
|
|
407
|
+
python(aid.com) -> kite-a -> federation -> kite-b -> ts(aid.net)
|
|
408
|
+
ts(aid.net) -> kite-b -> federation -> kite-a -> python(aid.com)
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
跨域客户端仍使用同一套 test-control API。test-runner 只需要切换目标 client URL 和目标 AID。
|
|
412
|
+
|
|
413
|
+
## test-runner 用例流程
|
|
414
|
+
|
|
415
|
+
单条 P2P E2EE 用例的标准流程:
|
|
416
|
+
|
|
417
|
+
```text
|
|
418
|
+
1. 等待 python-client /health: agent_ready=true
|
|
419
|
+
2. 等待 ts-client /health: agent_ready=true
|
|
420
|
+
3. 调两个 client /reset
|
|
421
|
+
4. 读取两个 client /identity
|
|
422
|
+
5. 生成 trace_id 和 message_id
|
|
423
|
+
6. 调 python-client /send(to=ts-aid, e2ee=true)
|
|
424
|
+
7. 轮询 ts-client /inbox?trace_id=...
|
|
425
|
+
8. 断言 received=true, decrypted=true, text=expected
|
|
426
|
+
9. 查询双方 /traces/{trace_id}
|
|
427
|
+
10. 记录测试结果与日志索引
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
反向用例只交换发送方和接收方。
|
|
431
|
+
|
|
432
|
+
失败时 test-runner 必须收集:
|
|
433
|
+
|
|
434
|
+
- 用例名、trace id、发送方、接收方、语言组合。
|
|
435
|
+
- `/health` 最终结果。
|
|
436
|
+
- `/identity` 结果。
|
|
437
|
+
- `/send` 响应。
|
|
438
|
+
- `/inbox` 最终响应。
|
|
439
|
+
- `/traces/{trace_id}`。
|
|
440
|
+
- 相关日志文件尾部。
|
|
441
|
+
|
|
442
|
+
## 优先测试矩阵
|
|
443
|
+
|
|
444
|
+
### P0:Python <-> TypeScript 单域
|
|
445
|
+
|
|
446
|
+
| 用例 | 方向 | 目标 |
|
|
447
|
+
| --- | --- | --- |
|
|
448
|
+
| health_ready | 双方 | 客户端完成认证和连接 |
|
|
449
|
+
| p2p_plain_smoke | Python -> TS, TS -> Python | 明文消息基础互通 |
|
|
450
|
+
| p2p_e2ee_smoke | Python -> TS, TS -> Python | E2EE 单条消息互通 |
|
|
451
|
+
| p2p_e2ee_sequence | 双向 | 连续多条消息不丢、不乱、ack 正常 |
|
|
452
|
+
| p2p_e2ee_large | 双向 | 大 payload 加解密与传输 |
|
|
453
|
+
| p2p_e2ee_concurrent | 双向 | 并发发送不串 session / message id |
|
|
454
|
+
| invalid_recipient | 双向 | 错误 recipient 必须失败 |
|
|
455
|
+
| tampered_ciphertext | 双向 | 篡改密文必须拒绝 |
|
|
456
|
+
| replay_message | 双向 | 重放消息必须拒绝或幂等处理 |
|
|
457
|
+
| reconnect_after_send | 双向 | 断线重连后消息状态一致 |
|
|
458
|
+
|
|
459
|
+
### P1:Python <-> TypeScript 双域
|
|
460
|
+
|
|
461
|
+
| 用例 | 方向 | 目标 |
|
|
462
|
+
| --- | --- | --- |
|
|
463
|
+
| federation_plain_smoke | aid.com -> aid.net, aid.net -> aid.com | 跨域明文消息 |
|
|
464
|
+
| federation_e2ee_smoke | aid.com -> aid.net, aid.net -> aid.com | 跨域 E2EE |
|
|
465
|
+
| federation_e2ee_sequence | 双向 | 跨域连续消息、ack、pull |
|
|
466
|
+
| federation_wrong_issuer | 双向 | issuer 绑定错误必须拒绝 |
|
|
467
|
+
| federation_reconnect | 双向 | 远端域重启后恢复 |
|
|
468
|
+
|
|
469
|
+
### P2:扩展语言
|
|
470
|
+
|
|
471
|
+
在 Python <-> TS 稳定后,再接入:
|
|
472
|
+
|
|
473
|
+
- Python <-> Go
|
|
474
|
+
- TS <-> Go
|
|
475
|
+
- Python <-> C++
|
|
476
|
+
- TS <-> C++
|
|
477
|
+
|
|
478
|
+
每接入一种语言,先完成共享测试向量和 test-control API,再进入真实 E2E。
|
|
479
|
+
|
|
480
|
+
### 浏览器 JavaScript
|
|
481
|
+
|
|
482
|
+
浏览器 SDK 不作为第一阶段 Docker 跨语言主路径。它应通过 Playwright 专项测试覆盖:
|
|
483
|
+
|
|
484
|
+
- WebCrypto 行为。
|
|
485
|
+
- CORS / HTTPS / 证书。
|
|
486
|
+
- bundle 加载。
|
|
487
|
+
- 浏览器 storage。
|
|
488
|
+
- 页面生命周期。
|
|
489
|
+
|
|
490
|
+
浏览器测试可以连接同一 Docker AUN 服务端,但 test-runner 应是 Playwright runner,而不是容器内 HTTP test-control 主路径。
|
|
491
|
+
|
|
492
|
+
## 产物目录
|
|
493
|
+
|
|
494
|
+
建议统一产物目录:
|
|
495
|
+
|
|
496
|
+
```text
|
|
497
|
+
docker-deploy/data/cross-sdk/
|
|
498
|
+
├── python/
|
|
499
|
+
│ └── AUN_DATA_ROOT
|
|
500
|
+
├── ts/
|
|
501
|
+
│ └── AUN_DATA_ROOT
|
|
502
|
+
├── logs/
|
|
503
|
+
│ ├── python/
|
|
504
|
+
│ └── ts/
|
|
505
|
+
└── artifacts/
|
|
506
|
+
├── results.json
|
|
507
|
+
├── results.jsonl
|
|
508
|
+
├── traces/
|
|
509
|
+
└── logs/
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
`results.jsonl` 每行记录一个用例结果,便于 CI 直接解析。`traces/` 保存按 trace id 聚合后的安全诊断信息。
|
|
513
|
+
|
|
514
|
+
## 日志与 trace 要求
|
|
515
|
+
|
|
516
|
+
所有跨语言 E2E 必须在日志中携带以下字段:
|
|
517
|
+
|
|
518
|
+
- `trace_id`
|
|
519
|
+
- `case_id`
|
|
520
|
+
- `language`
|
|
521
|
+
- `aid`
|
|
522
|
+
- `peer_aid`
|
|
523
|
+
- `message_id`
|
|
524
|
+
- `session_id`
|
|
525
|
+
- `key_id`
|
|
526
|
+
- `device_id`
|
|
527
|
+
- `slot_id`
|
|
528
|
+
- `stage`
|
|
529
|
+
- `error_code`
|
|
530
|
+
|
|
531
|
+
E2EE 诊断只记录 hash 或指纹:
|
|
532
|
+
|
|
533
|
+
- `canonical_sha256`
|
|
534
|
+
- `aad_sha256`
|
|
535
|
+
- `ciphertext_sha256`
|
|
536
|
+
- `public_key_fingerprint`
|
|
537
|
+
|
|
538
|
+
不得记录:
|
|
539
|
+
|
|
540
|
+
- 私钥。
|
|
541
|
+
- 明文会话密钥。
|
|
542
|
+
- 原始敏感明文。
|
|
543
|
+
- token / refresh token。
|
|
544
|
+
- 可用于重放认证的完整 challenge 或签名材料。
|
|
545
|
+
|
|
546
|
+
## 身份与数据隔离
|
|
547
|
+
|
|
548
|
+
跨语言同时运行时,必须避免共享同一个 SDK 本地数据库或密钥目录。原因:
|
|
549
|
+
|
|
550
|
+
- Python 使用 SQLCipher 数据库。
|
|
551
|
+
- TS/Node 可能使用不同 SQLite 或文件存储。
|
|
552
|
+
- Go/C++ 也可能有独立存储格式。
|
|
553
|
+
- 多进程共写同一身份目录容易产生锁冲突和密钥材料竞争写入。
|
|
554
|
+
|
|
555
|
+
推荐策略:
|
|
556
|
+
|
|
557
|
+
- 每个语言 client 使用独立数据目录。
|
|
558
|
+
- 每个语言 client 使用独立 AID。
|
|
559
|
+
- 如果必须使用固定 AID,固定身份由该语言自己的初始化流程创建和维护。
|
|
560
|
+
- test-runner 只读取 `/identity` 结果,不直接读写身份材料。
|
|
561
|
+
|
|
562
|
+
## CLI 的必要性
|
|
563
|
+
|
|
564
|
+
TS 侧有必要提供一个最小测试 CLI,但定位是测试入口和调试入口,不是首阶段产品 CLI。原因:
|
|
565
|
+
|
|
566
|
+
- Docker 中启动 Node CLI 稳定、可观察、可由 Compose 管理。
|
|
567
|
+
- 可以直接用于共享测试向量和 transcript 回放。
|
|
568
|
+
- 可与 Python CLI 做一致的 JSON 输入输出和退出码。
|
|
569
|
+
- 失败时能在不启动完整 agent 的情况下复现协议问题。
|
|
570
|
+
|
|
571
|
+
建议统一 CLI 规范:
|
|
572
|
+
|
|
573
|
+
- `--json` 输出机器可读 JSON。
|
|
574
|
+
- stdin 支持 JSON 输入。
|
|
575
|
+
- exit code `0` 表示动作成功,`1` 表示运行时失败,`2` 表示参数错误,`3` 表示断言失败。
|
|
576
|
+
- 错误响应包含 `error_code`、`error_message`、`stage`、`trace_id`。
|
|
577
|
+
- CLI 和 test-control 复用同一套结果 JSON schema。
|
|
578
|
+
|
|
579
|
+
## 失败分类
|
|
580
|
+
|
|
581
|
+
test-runner 应按层分类失败,避免调试方向混乱。
|
|
582
|
+
|
|
583
|
+
| 分类 | 判定 | 优先排查 |
|
|
584
|
+
| --- | --- | --- |
|
|
585
|
+
| fixture 失败 | 共享向量不一致 | 序列化、base64、签名输入、AAD、加密原语 |
|
|
586
|
+
| transcript 失败 | 文件回放不一致 | envelope 字段、状态机、非法包拒绝 |
|
|
587
|
+
| readiness 失败 | `/health` 不 ready | 身份准备、认证、gateway discovery、连接 |
|
|
588
|
+
| send 失败 | `/send` 返回失败 | RPC 参数、服务端错误、客户端发送逻辑 |
|
|
589
|
+
| delivery 失败 | 接收方 inbox 超时 | 服务端路由、push/pull、订阅、ack |
|
|
590
|
+
| decrypt 失败 | 收到但 `decrypted=false` | E2EE session、prekey、recipient、AAD |
|
|
591
|
+
| federation 失败 | 单域通过、双域失败 | issuer、well-known、federation envelope、证书链 |
|
|
592
|
+
|
|
593
|
+
## 落地阶段
|
|
594
|
+
|
|
595
|
+
### 阶段 1:规范与最小 test-agent
|
|
596
|
+
|
|
597
|
+
- 定义 test-control API schema。
|
|
598
|
+
- Python 增加测试 agent 入口,复用现有 SDK 和 CLI 能力。
|
|
599
|
+
- TS 增加最小测试 CLI / test-agent。
|
|
600
|
+
- test-runner 先支持 Python <-> TS 单条明文和单条 E2EE。
|
|
601
|
+
|
|
602
|
+
### 阶段 2:单域 P0 矩阵
|
|
603
|
+
|
|
604
|
+
- 补 Python -> TS、TS -> Python 的 P2P E2EE smoke。
|
|
605
|
+
- 补连续、多条、大消息、并发、非法包。
|
|
606
|
+
- 输出 `results.jsonl` 和 trace 产物。
|
|
607
|
+
|
|
608
|
+
### 阶段 3:双域 P1 矩阵
|
|
609
|
+
|
|
610
|
+
- 在 `federation-test` 增加 Python/TS 跨域客户端。
|
|
611
|
+
- 复用同一 test-runner 用例,只替换 client URL 与 AID。
|
|
612
|
+
- 增加 issuer 错误、远端域重启、跨域 reconnect。
|
|
613
|
+
|
|
614
|
+
### 阶段 4:扩展语言
|
|
615
|
+
|
|
616
|
+
- Go/C++ 先接入共享测试向量。
|
|
617
|
+
- 再实现最小 test-control API。
|
|
618
|
+
- 最后加入跨语言真实 E2E 矩阵。
|
|
619
|
+
|
|
620
|
+
### 阶段 5:浏览器专项
|
|
621
|
+
|
|
622
|
+
- Playwright 启真实浏览器。
|
|
623
|
+
- 页面加载 browser SDK。
|
|
624
|
+
- 连接同一 Docker AUN 服务端。
|
|
625
|
+
- 覆盖 browser SDK 与 Python/TS 后端客户端互通。
|
|
626
|
+
|
|
627
|
+
## 与现有测试环境的关系
|
|
628
|
+
|
|
629
|
+
现有 `docs/aun测试运行指南.md` 记录了当前单域和双域 Docker 测试命令,仍作为运行指南使用。本文档定位为跨语言容器 E2E 的设计方案。
|
|
630
|
+
|
|
631
|
+
当前现状:
|
|
632
|
+
|
|
633
|
+
- 单域已有 `kite-sdk-tester`、`kite-ts-tester`、`kite-go-tester`、`kite-cpp-tester`。
|
|
634
|
+
- 双域已有 `client-a`、`client-b`、`ts-tester`、`go-tester`、`cpp-client-a`、`cpp-client-b`。
|
|
635
|
+
- 这些容器当前主要是“测试执行容器”,常见模式是 `sleep infinity` 后用 `docker exec` 手动跑测试。
|
|
636
|
+
- 跨语言 E2E 的目标形态是“常驻语言客户端 + test-control + test-runner”,减少宿主机脚本和人工 docker exec 编排。
|
|
637
|
+
|
|
638
|
+
推荐新增独立 Compose override 文件,而不是直接改动现有常规测试服务:
|
|
639
|
+
|
|
640
|
+
```text
|
|
641
|
+
docker-compose.cross-sdk.yml
|
|
642
|
+
federation-test/docker-compose.cross-sdk.yml
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
这样现有测试命令不受影响,跨语言测试可以按需启用。
|
|
646
|
+
|
|
647
|
+
## 验收标准
|
|
648
|
+
|
|
649
|
+
首阶段完成后,应满足:
|
|
650
|
+
|
|
651
|
+
- 一条命令启动单域 AUN 服务端、Python client、TS client、test-runner。
|
|
652
|
+
- test-runner 能自动等待两个 client ready。
|
|
653
|
+
- Python -> TS E2EE 单条消息通过。
|
|
654
|
+
- TS -> Python E2EE 单条消息通过。
|
|
655
|
+
- 任一方向失败时能输出 trace id、双方 identity、send 响应、inbox 响应、trace 诊断和日志路径。
|
|
656
|
+
- 不需要 test-runner import Python SDK 或 TS SDK。
|
|
657
|
+
- 不需要在 test-runner 容器中使用 Docker socket。
|
|
658
|
+
- 不共享跨语言本地身份数据库。
|
|
659
|
+
|
|
660
|
+
后续完成双域阶段后,应满足:
|
|
661
|
+
|
|
662
|
+
- aid.com Python -> aid.net TS 跨域 E2EE 通过。
|
|
663
|
+
- aid.net TS -> aid.com Python 跨域 E2EE 通过。
|
|
664
|
+
- issuer 错误和篡改 envelope 类用例能稳定失败并给出可定位错误码。
|
|
665
|
+
|