@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.
- package/CHANGELOG.md +177 -67
- 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 +177 -67
- package/_packed_docs/INDEX.md +124 -65
- package/_packed_docs/KITE_DOCS_GUIDE.md +65 -30
- package/_packed_docs/agent.md/SCHEMA.md +83 -58
- package/_packed_docs/agent.md/examples/codeagent-claudecode.md +1 -1
- package/_packed_docs/agent.md/examples/openclaw-lobster.md +1 -1
- package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +1 -1
- 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 +234 -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 +1095 -0
- 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
- package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +6 -4
- package/_packed_docs/group-message-rpc-alignment-gaps.md +741 -0
- package/_packed_docs/message-online-push-alignment.md +572 -0
- 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 +63 -18
- 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 +93 -84
- 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 +73 -34
- package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +3 -3
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +21 -9
- package/_packed_docs/sdk/09-group-rpc-manual.md +319 -285
- package/_packed_docs/sdk/09-message-rpc-manual.md +144 -103
- package/_packed_docs/sdk/09-payload-reference.md +1 -1
- package/_packed_docs/sdk/09-storage-rpc-manual.md +14 -3
- package/_packed_docs/sdk/09-stream-rpc-manual.md +8 -8
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +34 -23
- package/_packed_docs/sdk/CHANGELOG-0.5.6.md +73 -0
- package/_packed_docs/sdk/INDEX.md +45 -37
- package/_packed_docs/sdk/README.md +11 -9
- package/_packed_docs//345/217/221/345/270/203/346/212/245/345/221/212-0.5.6.md +260 -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/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-schema.d.ts +14 -0
- package/dist/agent-md-schema.d.ts.map +1 -0
- package/dist/agent-md-schema.js +103 -0
- package/dist/agent-md-schema.js.map +1 -0
- package/dist/agent-md.d.ts +11 -5
- package/dist/agent-md.d.ts.map +1 -1
- package/dist/agent-md.js +295 -53
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +7 -7
- package/dist/aid-store.d.ts.map +1 -1
- package/dist/aid-store.js +46 -18
- package/dist/aid-store.js.map +1 -1
- package/dist/aid.d.ts +2 -0
- package/dist/aid.d.ts.map +1 -1
- package/dist/aid.js +29 -7
- package/dist/aid.js.map +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +31 -11
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +29920 -19719
- package/dist/cert-utils.d.ts +1 -0
- package/dist/cert-utils.d.ts.map +1 -1
- package/dist/cert-utils.js +36 -16
- package/dist/cert-utils.js.map +1 -1
- package/dist/client/delivery.d.ts +106 -11
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js +1925 -374
- 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 +15 -1
- package/dist/client/lifecycle.d.ts.map +1 -1
- package/dist/client/lifecycle.js +477 -132
- 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 +34 -2
- package/dist/client/rpc-pipeline.d.ts.map +1 -1
- package/dist/client/rpc-pipeline.js +503 -99
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/runtime.d.ts +1 -3
- package/dist/client/runtime.d.ts.map +1 -1
- package/dist/client/runtime.js +4 -7
- package/dist/client/runtime.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts +43 -2
- package/dist/client/v2-e2ee.d.ts.map +1 -1
- package/dist/client/v2-e2ee.js +931 -138
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +46 -15
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +785 -304
- 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 +26 -1
- package/dist/facades.d.ts.map +1 -1
- package/dist/facades.js +142 -60
- package/dist/facades.js.map +1 -1
- package/dist/group-id.d.ts.map +1 -1
- package/dist/group-id.js +2 -17
- package/dist/group-id.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 +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- 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 +224 -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 +399 -11
- 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 +226 -102
- 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/validators.d.ts.map +1 -1
- package/dist/validators.js +8 -14
- package/dist/validators.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +11 -9
- 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
package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md
ADDED
|
@@ -0,0 +1,1199 @@
|
|
|
1
|
+
# AUN 默认单实例集成测试与 E2E 运行指南
|
|
2
|
+
|
|
3
|
+
> 本文中的仓库根目录为 `D:\modelunion\kite`。单实例 Docker 环境位于
|
|
4
|
+
> `D:\modelunion\kite\docker-deploy`,SDK 源码与测试位于
|
|
5
|
+
> `D:\modelunion\kite\aun-sdk-core`。
|
|
6
|
+
|
|
7
|
+
本文档说明默认 `agentid.pub` 单实例服务端、四语言 Tester、默认 cross-SDK、集成测试和 E2E 的运行方式,同时给出单实例生产包的构建与部署入口。三节点、本地 `agentid.pub/agentid.cn` 跨域 Docker 和隔离 `dist-aid.*` federation 统一见分布式指南。
|
|
8
|
+
|
|
9
|
+
## 测试指南:
|
|
10
|
+
D:\modelunion\kite\aun-sdk-core\docs\aun测试运行指南.md
|
|
11
|
+
D:\modelunion\kite\aun-sdk-core\docs\aun分布式测试运行指南.md
|
|
12
|
+
D:\modelunion\kite\aun-sdk-core\docs\aun公网测试运行指南.md
|
|
13
|
+
|
|
14
|
+
运行测试(单元、集成、E2E, cross-sdk, 双域)时应该使用断点续跑的方法,即运行到某个测试时如果发生失败,应该立即停下来,修复此用例,然后再接着此用例运行后续用例。之前通过的用例如果手续修改不受影响则不要重复跑。
|
|
15
|
+
|
|
16
|
+
## 先选环境
|
|
17
|
+
|
|
18
|
+
本机有多套 AUN Docker 环境。选择环境必须同时核对 **Compose 文件、域名、数据目录、Compose project、容器名和网络名**,不能只看 `kite-app` 是否正在运行。
|
|
19
|
+
|
|
20
|
+
| 环境 | 服务端 Compose | 域名 | 持久化数据 | project / 网络 | 主要容器 |
|
|
21
|
+
| --- | --- | --- | --- | --- | --- |
|
|
22
|
+
| agentid.pub 本地单实例 | 根 `docker-compose.yml` + `agentid.pub/docker-compose.yml` + `agentid.pub/local.env` | `agentid.pub` | `docker-deploy/data` | `kite-single` / `kite-single_kite-net` | `kite-app`、`kite-mysql`、`kite-redis` |
|
|
23
|
+
| agentid.cn 本地跨域对端 | 根 `docker-compose.yml` + `agentid.cn/docker-compose.yml` + `agentid.cn/local.env` | `agentid.cn` | `docker-deploy/data-agentid-cn` | `kite-agentid-cn-local` / `kite-agentid-cn-local_kite-net` | `kite-agentid-cn-local-*` |
|
|
24
|
+
| 三节点分布式 | `D:\modelunion\kite\docker-deploy\docker-compose.distributed.yml` | `dist-agentid.pub` | `D:\modelunion\kite\docker-deploy\data-dist` | `kite-main-dist-worktree` / `kite-main-dist-worktree_kite-distributed-net` | `kite-main-dist-*` |
|
|
25
|
+
| 本地真实域名双域 Docker | 两套上述单节点 Compose 均叠加 `docker-compose.agentid-federation.yml` | `agentid.pub`、`agentid.cn` | 两域各自固定数据根 | 两个独立 project,共享 `kite-agentid-federation-net` | `kite-app`、`kite-agentid-cn-local-app` 及各自 MySQL/Redis |
|
|
26
|
+
| 隔离双域 federation | `D:\modelunion\kite\docker-deploy\federation-test\docker-compose.yml` | `dist-aid.com`、`dist-aid.net` | `D:\modelunion\kite\docker-deploy\federation-test\data-dist` | `kite-main-dist-federation` / `kite-main-dist-federation_federation-net` | `main-dist-federation-*`、`main-dist-client-*` |
|
|
27
|
+
|
|
28
|
+
`agentid.pub` 与 `agentid.cn` 使用不同 project、容器名、私有网络、CA、服务 AID、MySQL 和 workspace。`agentid.cn` 的宿主机入口已改为 42xxx、MySQL 为 8406,因此两域可以并行;跨域测试时必须让两域同时叠加 federation overlay。该 overlay 只把两个 Kite 业务节点接入共享网络,MySQL 和 Redis 始终留在各自域内。
|
|
29
|
+
|
|
30
|
+
Tester 和 cross-SDK 都不是服务端环境:
|
|
31
|
+
|
|
32
|
+
| 测试运行面 | Compose | project / 网络 | 依赖的服务端 |
|
|
33
|
+
| --- | --- | --- | --- |
|
|
34
|
+
| agentid.pub 四语言 Tester | `docker-deploy/docker-compose.testers.yml` + `agentid.pub/local.env` | `kite-sdk-testers`,接入 `kite-single_kite-net` | agentid.pub 本地单实例 |
|
|
35
|
+
| agentid.cn 四语言 Tester | `docker-deploy/docker-compose.testers.yml` + `agentid.cn/local.env` | `agentid.cn/local.env` 指定的独立 project,接入 `kite-agentid-cn-local_kite-net` | agentid.cn 本地单节点 |
|
|
36
|
+
| 默认 cross-SDK | `aun-sdk-core/tests/cross-sdk/docker-compose.cross-sdk.yml` | 接入 internal `aun-cross-sdk-local` | 已额外接入该网络的默认 `kite-app` |
|
|
37
|
+
| 分布式四语言 Tester | `D:\modelunion\kite\docker-deploy\docker-compose.distributed-testers.yml` | `kite-main-dist-sdk-testers`,接入 `kite-main-dist-worktree_kite-distributed-net` | 三节点分布式 |
|
|
38
|
+
| 分布式 cross-SDK | `D:\modelunion\kite\aun-sdk-core\tests\cross-sdk\docker-compose.cross-sdk.distributed.yml` | `kite-main-dist-cross-sdk`,接入分布式网络 | 三节点分布式 |
|
|
39
|
+
|
|
40
|
+
根目录 `docker-compose.yml` 是两域共用的单节点分布式控制模型,域目录中的同名文件只做域与宿主端口覆盖。单域命令必须同时显式传入根文件和对应域覆盖文件;跨域命令还必须叠加 `docker-compose.agentid-federation.yml`。不能只启动覆盖文件,也不能启动历史的 `evolagent.cn` 或 `data-evolagent-cn/docker-compose.yml`。
|
|
41
|
+
|
|
42
|
+
本机还存在以下 Compose 材料,但都不是默认集成测试入口:
|
|
43
|
+
|
|
44
|
+
| 路径 | 实际用途 | 本地测试约束 |
|
|
45
|
+
| --- | --- | --- |
|
|
46
|
+
| `docker-deploy/data-agentid-pub/docker-compose.yml` | 历史 `agentid.pub` 生产迁移清单 | 不得启动;当前固定数据真源是 `docker-deploy/data` |
|
|
47
|
+
| `docker-deploy/data-aun-pub/docker-compose.yml` | `aun.pub` 独立服务器部署材料 | 不纳入默认 `agentid.pub` 测试 |
|
|
48
|
+
| `docker-deploy/evolagent.cn/`、`docker-deploy/data-evolagent-cn/docker-compose.yml` | 历史域部署材料 | 只保留历史线索;当前本地跨域对端是 `agentid.cn`,不得启动这些旧入口 |
|
|
49
|
+
| `docker-deploy/app/docker-compose.yml` | 生产包展开目录或本机临时副本 | 不作为源码 worktree 的测试真源 |
|
|
50
|
+
| `docker-deploy/federation-test/docker-compose.yml` | 当前 worktree 的双域 federation | 只按分布式指南运行;不得引用相邻 worktree 的同名 Compose、`data-dist` 或 Tester |
|
|
51
|
+
|
|
52
|
+
### 默认单实例测试前强制核验
|
|
53
|
+
|
|
54
|
+
每次开始本地单实例测试前,先选择域并执行以下只读检查。材料清单固定了 Issuer CA 指纹、10 个服务 AID 和 MySQL `server-uuid`;Compose 解析结果必须把 MySQL 和应用四个数据挂载全部指向同一域:
|
|
55
|
+
|
|
56
|
+
```powershell
|
|
57
|
+
$domain = 'agentid.pub' # 校验本地跨域对端时改为 agentid.cn
|
|
58
|
+
cd D:\modelunion\kite\docker-deploy
|
|
59
|
+
python scripts\domain_materials.py validate "$domain\materials.json"
|
|
60
|
+
docker compose --env-file "$domain\local.env" --project-directory . `
|
|
61
|
+
-f docker-compose.yml -f "$domain\docker-compose.yml" config --quiet
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
启动后再核对运行态。下面以 `agentid.pub` 为例;`agentid.cn` 对应前缀是 `kite-agentid-cn-local`,数据根是 `data-agentid-cn`:
|
|
65
|
+
|
|
66
|
+
```powershell
|
|
67
|
+
function Resolve-DockerBindSource([string]$source) {
|
|
68
|
+
if ($source -match '^/run/desktop/mnt/host/([A-Za-z])/(.*)$') {
|
|
69
|
+
$source = "$($Matches[1]):\$($Matches[2] -replace '/', '\')"
|
|
70
|
+
}
|
|
71
|
+
[IO.Path]::GetFullPath($source)
|
|
72
|
+
}
|
|
73
|
+
$containers = docker inspect kite-app kite-mysql kite-redis |
|
|
74
|
+
ConvertFrom-Json
|
|
75
|
+
$badProject = $containers | Where-Object {
|
|
76
|
+
$_.Config.Labels.'com.docker.compose.project' -ne 'kite-single'
|
|
77
|
+
}
|
|
78
|
+
if ($badProject) { throw "混入错误 project: $($badProject.Name -join ', ')" }
|
|
79
|
+
$mysqlSource = (($containers | Where-Object Name -eq '/kite-mysql').Mounts |
|
|
80
|
+
Where-Object Destination -eq '/var/lib/mysql').Source
|
|
81
|
+
$expected = (Resolve-Path .\data\mysql).Path
|
|
82
|
+
if ((Resolve-DockerBindSource $mysqlSource) -ine $expected) { throw "MySQL 数据根错误: $mysqlSource" }
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Docker Desktop 可能把 Windows bind source 返回为 `/run/desktop/mnt/host/<盘符>/...`;上面的归一化用于避免把当前 worktree 误判成外部目录。
|
|
86
|
+
|
|
87
|
+
如果机器上还残留旧 `kite-single` 混合容器,只执行一次 `docker compose --env-file NUL -f docker-compose.yml down` 清理旧容器,不能加 `-v`。不得删除 MySQL/AID 目录,也不得通过 `setup_aids.py` 或清库掩盖环境选错。
|
|
88
|
+
|
|
89
|
+
## 当前单实例验收基线
|
|
90
|
+
|
|
91
|
+
单实例不是旧版“所有服务直接本地启动”的模式,而是分布式架构的单节点形态:一个 `control_master` 节点承载一个 Launcher,由 Launcher defer 启动 AUN 服务;控制中心、注册中心和配置中心是三个逻辑职责,物理上共同由 `aun_console` 的同一地址提供。
|
|
92
|
+
|
|
93
|
+
| 文件 | 包含内容 | 使用场景 |
|
|
94
|
+
| --- | --- | --- |
|
|
95
|
+
| `docker-compose.yml` | `mysql`、`redis`、`kite` | 本地服务端和最小生产包的基础清单 |
|
|
96
|
+
| `docker-compose.testers.yml` | Python、Go、TypeScript、JavaScript SDK Tester | 服务端启动后作为独立 Compose project 启动 |
|
|
97
|
+
| `docker-compose.build.yml` | `kite`、`sdk-tester` 镜像构建定义 | 服务端或 Python Tester 镜像需要重建时 |
|
|
98
|
+
|
|
99
|
+
当前验收口径:
|
|
100
|
+
|
|
101
|
+
- `auth`、`ca`、`gateway`、`group`、`leaderboard`、`message`、`nameservice`、`service_proxy`、`storage`、`stream` 的默认 `module.md` 均启动 Go binary,不需要 Go overlay;Python 版本只用于人工回滚对照,不会在 Go 启动失败后自动接管。
|
|
102
|
+
- 单节点默认拓扑为 `AUN_CLUSTER_ID=aun-local`、`AUN_NODE_ID=aun-local`、`AUN_NODE_ROLE=control_master`,控制、注册、配置三个 URL 默认都指向 `https://aun-console.agentid.pub:19876`。`aun_console.agentid.pub` 是服务 AID,不得当作需要 TLS 主机名校验的 DNS 地址。
|
|
103
|
+
- 服务只有在 desired-state 为 `running` 且实际发送 `module.ready` 后才会注册;停止、未启动、未 ready 或不在 desired-state 中的服务不应出现在活动注册实例中。
|
|
104
|
+
- 单实例不需要为每个服务或每次启动生成独立控制令牌。Compose 提供单节点控制面默认值,Launcher 负责本节点内服务生命周期与模块凭据。
|
|
105
|
+
- 单实例共享同一个 MySQL 服务及 `host/port/user/password`,但每个持久化服务始终按自身历史库名确定默认数据库;`aun` 过去不是、以后也不会是公共默认库。Compose 不创建公共默认库,也不向应用注入 `KITE_DB_DATABASE` 或 `KITE_DB_DSN`;只有外部显式配置时才覆盖服务默认值。
|
|
106
|
+
- `agentid.pub` overlay 会启动 Mail 专用 PostgreSQL;Mail 默认以 enabled 状态随 Kite 启动并注册 AUN `mail.*` RPC。服务端 SMTP 入站/出站默认关闭,SMTP bridge 通过独立开关验收;不启动 Mailpit、IMAP 或 SMTP Submission。
|
|
107
|
+
- 单实例 Storage 数据面默认使用原生 HTTPS:`https://storage.agentid.pub:9470`,复用既有证书与 CA bundle。
|
|
108
|
+
- 不读取目录中的隐式 `.env`。本地域环境显式传入对应 `local.env`,无域基础命令使用 `--env-file NUL`;Linux 部署脚本只读取调用方显式导出的环境变量。
|
|
109
|
+
- Python 广义全量验收仍跳过文件名包含 `mail` 或 `reconnect` 的测试;Mail 使用本指南定义的专用脚本单独验收。带 `if __name__ == "__main__"` 的脚本使用 `python <file>`,纯 pytest 文件使用 `python -m pytest -q <file>`;pytest 退出码 `5` 只表示未收集到用例,不能直接判定为服务失败。
|
|
110
|
+
|
|
111
|
+
## 四语言测试矩阵
|
|
112
|
+
|
|
113
|
+
当前回归口径覆盖 Python、TypeScript、Go、JavaScript 四种 SDK 形态:
|
|
114
|
+
|
|
115
|
+
| 语言 | 默认单实例集成 / E2E | 双域集成 / E2E | 运行位置 |
|
|
116
|
+
| --- | --- | --- | --- |
|
|
117
|
+
| Python | `kite-python-sdk-tester` 容器内 `/tests/*.py` | 见分布式指南的 `main-dist-client-a` / `main-dist-client-b` | Docker 测试容器为主,少数 reconnect 脚本在宿主机 |
|
|
118
|
+
| TypeScript | `kite-ts-tester` 容器内 `tests/integration`、`tests/e2e` | 见分布式指南的 `main-dist-federation-ts-tester` | Docker 测试容器为主,reconnect 由宿主机协调 |
|
|
119
|
+
| Go | `kite-go-tester` 容器或临时 `golang:1.24-bookworm` 容器 | 见分布式指南的 `main-dist-federation-go-tester` | Docker 网络内运行,reconnect 由宿主机 marker 协调 |
|
|
120
|
+
| JavaScript | `kite-js-tester` 容器内运行 Vitest 或 Playwright `tests/e2e-browser` | 当前无独立双域 JS 浏览器 E2E 标准命令 | 默认单实例优先使用带 Chrome 的 Docker Tester;宿主机 Playwright 可作为备选 |
|
|
121
|
+
|
|
122
|
+
JS 的真实 E2E 统一使用 `js/tests/e2e-browser`,不要把浏览器 E2E 混入 `tests/integration`。`kite-js-tester` 已提供 Linux Chrome;宿主机运行时仍使用 `playwright.agentid-local.config.ts`。
|
|
123
|
+
|
|
124
|
+
所有 Go 测试窗口统一使用 `golang:1.24-bookworm`,当前实测工具链为 `go1.24.13`。这只统一测试编译器,不改变 SDK 的最低兼容约束;`go/go.mod` 继续声明 `go 1.22`。
|
|
125
|
+
|
|
126
|
+
## 基本原则
|
|
127
|
+
|
|
128
|
+
- 不修改 `/etc/hosts`,统一使用 Docker network alias 做域名解析。
|
|
129
|
+
- 不硬编码 `gateway_url`,Gateway 统一通过 `https://{issuer}/.well-known/aun-gateway` 或 `http://{issuer}/.well-known/aun-gateway` 发现。
|
|
130
|
+
- 服务端对外返回的 URL 必须是 `{svc}.{issuer-domain}` 风格,不能出现 `127.0.0.1`、`localhost`、`0.0.0.0`、`::1`。
|
|
131
|
+
- `docker-compose.yml` 是可直接上线的服务端清单,禁止把 SDK Tester、测试源码挂载或测试数据目录加回该文件;服务端与 `docker-compose.testers.yml` 必须分别启动,不能合并为同一个 Compose project。
|
|
132
|
+
- 分布式与双域测试统一按分布式指南运行,主指南不维护第二套 federation 命令。
|
|
133
|
+
- Windows Git Bash 运行 `docker exec` / `docker run` 且命令里包含容器内绝对路径(如 `/tests/...`、`/test/...`、`/workspace/...`)时,统一在命令前加 `MSYS_NO_PATHCONV=1`,避免 Git Bash 把容器路径错误改写成宿主机路径。
|
|
134
|
+
- 默认单实例 Python Tester 使用 `AUN_TEST_AUN_PATH=/data/aun-fixed-agentid-pub`,对应宿主机 `docker-deploy/data/extended-acceptance/group-management`;这里的 Alice/Bobb/Charlie 证书与 `data/mysql` 中的活动记录配套。
|
|
135
|
+
- **所有语言 SDK 的集成/E2E 测试必须串行运行**。即使各 Tester 使用独立本地数据目录,测试仍会复用服务端固定 AID、群、游标和消息状态;并行运行会造成相互污染。推荐按 Python → TypeScript → Go → JavaScript 的顺序依次运行。
|
|
136
|
+
- 如果改了 `extensions/services` 下的服务端代码,必须重新 build Docker 镜像并重启对应容器。
|
|
137
|
+
- 如果只改了各语言 SDK 源码或测试脚本,测试容器/宿主机通常都是目录挂载或直接读取,通常不需要 rebuild 镜像,直接重跑即可。
|
|
138
|
+
- `kite-python-sdk-tester` 使用预构建的 `aun-sdk-tester` 镜像(`Dockerfile.sdk-tester`),已内置所有 Python 测试依赖,`--force-recreate` 后无需手动安装。SDK 0.5.6 仅使用标准库 `sqlite3`,Tester 不得安装已废弃的 `sqlcipher3` 原生扩展。
|
|
139
|
+
- 默认 Tester project 提供 `kite-python-sdk-tester`、`kite-go-tester`、`kite-ts-tester`、`kite-js-tester`;双域容器名和命令统一见分布式指南。
|
|
140
|
+
- JavaScript 浏览器 SDK 的真实网络 E2E 优先进入 `kite-js-tester` 运行,也可以在宿主机用 Playwright 运行。
|
|
141
|
+
- TS 测试容器使用独立 Docker volume 挂载 `/workspace/ts/node_modules`,避免宿主机 Windows `node_modules` 污染 Linux 容器。
|
|
142
|
+
- TS/JS 使用各自独立的 Linux `node_modules` volume,不复用宿主机 Windows 原生模块。依赖准备与业务测试分阶段执行;业务测试阶段禁止访问外网,缺缓存时应停止并先完成离线依赖准备,不能让 `npm` 在测试过程中临时下载。
|
|
143
|
+
- `kite-single_kite-net`、`kite-agentid-cn-local_kite-net`、`kite-agentid-federation-net` 和分布式业务网络都不是 `internal` 网络,清空代理变量也不等于物理断网。标准 Tester 依靠“复用既有容器、禁用安装器、只访问目标域名”保证业务测试不主动联网;需要硬隔离时使用本文的 `aun-cross-sdk-local` internal 网络或宿主机出站防火墙。
|
|
144
|
+
- 如果改了 TS/JS 的 `package.json` 或 lockfile,必须先在允许的依赖准备环境更新对应 Linux volume,再进入断网业务测试阶段。
|
|
145
|
+
- Go 优先使用仓库 `vendor` 或已有只读模块缓存;所有 Go 测试窗口统一为 `golang:1.24-bookworm`,业务测试阶段不得联网下载模块。
|
|
146
|
+
- TS/Go 双域 reconnect 测试不是单纯 `docker exec` 一条命令,具体协调方式见分布式指南。
|
|
147
|
+
- **测试过程必须输出即时调试信息**,以便观察执行进度和快速定位失败。各语言的做法:
|
|
148
|
+
- Python:`pytest` 加 `-v -s`(`-s` 禁止捕获 stdout/stderr),或直接 `python script.py`(脚本内 print 自动可见)。
|
|
149
|
+
- TypeScript:`vitest run` 默认输出即时日志;如需更详细,加 `--reporter=verbose`。
|
|
150
|
+
- Go:`go test -v`(`-v` 打印每个用例名称和 `t.Log` 输出)。
|
|
151
|
+
- JavaScript(Playwright):默认 reporter 已输出即时进度;如需 stdout,加 `--reporter=list`。
|
|
152
|
+
|
|
153
|
+
### 测试环境数据保护(最高优先级)
|
|
154
|
+
|
|
155
|
+
**严格禁止未经用户明确同意的以下操作:**
|
|
156
|
+
|
|
157
|
+
- **禁止删除或清空 AID 身份材料**:包括私钥(`*.key`)、证书(`*.crt`)、`key.json`、本地数据库(`*.db`)等。这些文件一旦丢失,对应 AID 将永久无法恢复。SDK 的 `key.json` 身份在构造 `AIDStore` 或 SDK 客户端时通过 `encryption_seed` / `seed_password` 显式传入 seed;身份目录不保存 seed,也不从 seed 文件恢复。Docker 服务身份直接只读挂载 `*.crt` 与 `*.key`,这条路径不需要 seed。
|
|
158
|
+
- **禁止删除或清空持久化身份目录**:包括 `client-data/`、`data/sdk-tester-aun/`、`data/extended-acceptance/group-management/`、容器内 `/data/aun/` 和 `/data/aun-fixed-agentid-pub/` 下的任何 AID 子目录。
|
|
159
|
+
- **禁止擅自执行数据库清理命令**:如 `DELETE FROM agentid_cert`、`DROP TABLE` 等。
|
|
160
|
+
- **禁止擅自执行 `setup_aids.py` 重建身份**:除非用户明确要求。
|
|
161
|
+
|
|
162
|
+
**可以安全执行的操作:**
|
|
163
|
+
|
|
164
|
+
- 读取、查看身份文件和数据库记录(只读)
|
|
165
|
+
- 运行已确认不会重建或覆盖固定身份的测试脚本
|
|
166
|
+
- 查看容器日志和状态
|
|
167
|
+
|
|
168
|
+
**原则:测试环境的固定身份是长期复用资产,不是一次性消耗品。任何涉及身份材料增删改的操作都必须先征得用户同意。**
|
|
169
|
+
|
|
170
|
+
## 目录约定
|
|
171
|
+
|
|
172
|
+
- 默认单实例 Docker 环境:`D:\modelunion\kite\docker-deploy`
|
|
173
|
+
- 分布式和双域 Docker 环境:见 `docs/aun分布式测试运行指南.md`
|
|
174
|
+
- AUN SDK Python 测试:`D:\modelunion\kite\aun-sdk-core\python\tests`
|
|
175
|
+
- AUN SDK TypeScript 测试:`D:\modelunion\kite\aun-sdk-core\ts\tests`
|
|
176
|
+
- AUN SDK Go 测试:`D:\modelunion\kite\aun-sdk-core\go`
|
|
177
|
+
- AUN SDK JavaScript 测试:`D:\modelunion\kite\aun-sdk-core\js\tests`
|
|
178
|
+
|
|
179
|
+
## 一次性准备
|
|
180
|
+
|
|
181
|
+
首次准备时构建服务镜像和 Python Tester 镜像。服务镜像会同时构建 10 个默认 Go 服务 binary:
|
|
182
|
+
|
|
183
|
+
```powershell
|
|
184
|
+
cd D:\modelunion\kite\docker-deploy
|
|
185
|
+
docker compose --env-file NUL -f docker-compose.build.yml build kite sdk-tester
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
镜像构建属于独立依赖准备阶段。断网业务测试阶段如果本机没有完整基础镜像和构建缓存,不得临时执行构建并访问外网;应停止测试并先准备离线镜像。
|
|
189
|
+
|
|
190
|
+
`aun-sdk-tester` 镜像(`Dockerfile.sdk-tester`)已内置所有 Python 测试依赖,包括 SDK 依赖以及 Service Proxy/Name Service 集成测试所需的 FastAPI、uvicorn、PyYAML、requests 和 `httpx`。正常情况下,`kite-python-sdk-tester` 启动后即可直接运行测试,无需手动安装。当前 SDK 仅依赖标准库 `sqlite3`,不要再安装 `sqlcipher3` / `sqlcipher3-binary`。
|
|
191
|
+
|
|
192
|
+
构建后分别校验服务端和 Tester Compose。第一条只能列出 `mysql`、`redis`、`kite`;第二条只能列出四个 Tester,不能包含服务端服务:
|
|
193
|
+
|
|
194
|
+
```powershell
|
|
195
|
+
docker compose --env-file agentid.pub/local.env --project-directory . `
|
|
196
|
+
-f docker-compose.yml -f agentid.pub/docker-compose.yml config --services
|
|
197
|
+
docker compose --env-file agentid.pub/local.env --project-directory . `
|
|
198
|
+
-f docker-compose.testers.yml config --services
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
如果只是重启默认服务容器 `kite`,而没有重建 Tester,不需要重新安装依赖。使用预构建的 `aun-sdk-tester` 镜像时,即使重新创建 Python Tester 也无需手动补依赖,因为依赖已烘焙在镜像中;TS/JS Tester 仍必须遵守后文的离线依赖准备规则。
|
|
202
|
+
|
|
203
|
+
## 默认单实例环境
|
|
204
|
+
|
|
205
|
+
### 启动服务端
|
|
206
|
+
|
|
207
|
+
```powershell
|
|
208
|
+
cd D:\modelunion\kite\docker-deploy
|
|
209
|
+
docker image inspect docker-deploy-kite:latest mysql:8.0 redis:7-alpine | Out-Null
|
|
210
|
+
if ($LASTEXITCODE -ne 0) { throw '默认服务端镜像未完成离线准备,停止测试' }
|
|
211
|
+
python scripts\domain_materials.py validate agentid.pub\materials.json
|
|
212
|
+
docker compose --env-file agentid.pub/local.env --project-directory . `
|
|
213
|
+
-f docker-compose.yml -f agentid.pub/docker-compose.yml up -d
|
|
214
|
+
docker compose --env-file agentid.pub/local.env --project-directory . `
|
|
215
|
+
-f docker-compose.yml -f agentid.pub/docker-compose.yml ps
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
这一步会启动 `kite-mysql`、`kite-redis`、`kite-mail-postgres`、`kite-app`,不会启动任何 SDK Tester。`kite-app` 内部的 Launcher 按 desired-state defer 加载 AUN 服务,Mail 使用独立 PostgreSQL 并以 AUN RPC-only 模式启动。
|
|
219
|
+
|
|
220
|
+
单节点三中心与数据库默认值在基础 Compose 中,域名、数据根、project 和节点标识由 `agentid.pub/local.env` 固定:
|
|
221
|
+
|
|
222
|
+
| 配置 | 默认值或规则 |
|
|
223
|
+
| --- | --- |
|
|
224
|
+
| 控制中心 | `AUN_CONTROL_BASE_URL=https://aun-console.agentid.pub:19876` |
|
|
225
|
+
| 注册中心 | `AUN_REGISTRY_BASE_URL=https://aun-console.agentid.pub:19876` |
|
|
226
|
+
| 配置中心 | `AUN_CONFIG_BASE_URL=https://aun-console.agentid.pub:19876` |
|
|
227
|
+
| MySQL 连接 | MySQL 容器不设置 `MYSQL_DATABASE`;应用只接收 `KITE_DB_HOST=mysql`、`KITE_DB_PORT=3306`、用户和密码,不创建或注入任何公共默认数据库,也不注入全局 `KITE_DB_DATABASE` / `KITE_DB_DSN` |
|
|
228
|
+
| 服务默认数据库 | AUN Console `aun_dashboard`、AID Custody `aun_aid_custody`、Auth `aun_auth`、CA `aun_cert`、Group `aun_group`、Leaderboard `aun_leaderboard`、Message `aun_message`、NameService `aun_nameservice`、Storage `aun_storage`;服务专用配置或显式全局数据库配置可以覆盖,均未配置时使用这些历史默认值 |
|
|
229
|
+
|
|
230
|
+
可以用以下命令检查服务发现、容器日志和默认 Go 进程:
|
|
231
|
+
|
|
232
|
+
```powershell
|
|
233
|
+
curl.exe -k https://localhost/.well-known/aun-gateway
|
|
234
|
+
docker logs --tail 200 kite-app
|
|
235
|
+
docker top kite-app | Select-String -Pattern "auth-go|ca-go|gateway-go|group-go|leaderboard-go|message-go|nameservice-go|service-proxy-go|storage-go|stream-go|mail-server"
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
发现结果必须返回 `gateway.agentid.pub`,不能返回 loopback 地址。活动注册实例应与 desired-state 和实际 ready 服务一致;Mail 应出现为 ready,并可通过 `mail.health` / `mail.status` 验证;SMTP bridge 未显式开启时不得出现 SMTP 入站/出站能力。
|
|
239
|
+
|
|
240
|
+
当前 `docker-compose.yml` 为 `kite` 服务配置的主要 network aliases 包括:
|
|
241
|
+
|
|
242
|
+
- `agentid.pub`
|
|
243
|
+
- `proxy.agentid.pub`
|
|
244
|
+
- `aun_console.agentid.pub`
|
|
245
|
+
- `gateway.agentid.pub`
|
|
246
|
+
- `leaderboard.agentid.pub`
|
|
247
|
+
- `stream.agentid.pub`
|
|
248
|
+
- `storage.agentid.pub`
|
|
249
|
+
- `group.agentid.pub`
|
|
250
|
+
|
|
251
|
+
### 启动 SDK Tester
|
|
252
|
+
|
|
253
|
+
在服务端已启动且默认单实例强制核验通过后,独立启动 Tester project。
|
|
254
|
+
|
|
255
|
+
`docker-compose.testers.yml` 的 TS/JS entrypoint 只校验 Python 辅助依赖、Linux `node_modules` 和 Chrome,不执行 `apt-get`、`pip`、`npm` 或下载。当前机器使用 `aun-ts-sdk-tester:local`、`aun-js-sdk-tester:local` 以及两个固定依赖 volume;业务测试前先只读核验:
|
|
256
|
+
|
|
257
|
+
```powershell
|
|
258
|
+
cd D:\modelunion\kite\docker-deploy
|
|
259
|
+
$required = @('kite-python-sdk-tester', 'kite-go-tester', 'kite-ts-tester', 'kite-js-tester')
|
|
260
|
+
$existing = docker ps -a --format '{{.Names}}'
|
|
261
|
+
$missing = $required | Where-Object { $_ -notin $existing }
|
|
262
|
+
if ($missing) { throw "Tester 尚未完成离线依赖准备,停止测试: $($missing -join ', ')" }
|
|
263
|
+
docker image inspect aun-sdk-tester:latest golang:1.24-bookworm `
|
|
264
|
+
aun-ts-sdk-tester:local aun-js-sdk-tester:local | Out-Null
|
|
265
|
+
docker volume inspect kite-sdk-testers_ts-tester-node-modules `
|
|
266
|
+
kite-sdk-testers_js-tester-node-modules | Out-Null
|
|
267
|
+
docker compose --env-file agentid.pub/local.env --project-directory . `
|
|
268
|
+
-f docker-compose.testers.yml start
|
|
269
|
+
docker compose --env-file agentid.pub/local.env --project-directory . `
|
|
270
|
+
-f docker-compose.testers.yml ps
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
该文件声明独立 project `kite-sdk-testers`,只管理 `kite-python-sdk-tester`、`kite-go-tester`、`kite-ts-tester`、`kite-js-tester`,并通过 external `kite-single_kite-net` 接入已运行的默认服务端。不要把它和 `docker-compose.yml` 用多个 `-f` 合并,也不要把它打进生产包。
|
|
274
|
+
|
|
275
|
+
首次依赖准备或依赖升级必须脱离断网业务测试阶段,重新制作本地 Tester 镜像并更新固定 Linux 依赖 volume。业务测试阶段即使执行 recreate 也只允许读取这些本地材料;任一依赖缺失时 entrypoint 以退出码 `70` 停止,不会联网自愈。
|
|
276
|
+
|
|
277
|
+
Python Tester 必须保留以下运行时设置:
|
|
278
|
+
|
|
279
|
+
- `PYTHONDONTWRITEBYTECODE=1`
|
|
280
|
+
- `PYTHONPYCACHEPREFIX=/tmp/aun-python-pycache-disabled`
|
|
281
|
+
- `PYTHONMALLOC=malloc`
|
|
282
|
+
- `AUN_SDK_UVLOOP=0`
|
|
283
|
+
- `AUN_CLI_UVLOOP=0`
|
|
284
|
+
- `AUN_BENCH_UVLOOP=0`
|
|
285
|
+
|
|
286
|
+
前两项让 Python 不读取仓库、镜像或旧容器层中的缓存字节码,也不生成新缓存。`PYTHONMALLOC=malloc` 继续作为构建期和运行期的一致诊断设置,但它不是本次崩溃的修复:可变标签 `python:3.11-slim` 当前解析到 Debian 13/glibc 2.41,在不安装任何第三方包时,使用默认分配器或系统 `malloc` 都能在标准库探针中出现 `SIGSEGV`。服务端和 Tester 必须显式固定 `python:3.11-bookworm`(Debian 12/glibc 2.36);该基线已连续通过 100 次标准库探针和 100 次完整依赖导入。三个 `AUN_*_UVLOOP` 开关必须显式为 `0`,Compose 中 `AUN_GATEWAY_USE_UVLOOP` 也默认关闭;服务镜像安装通用依赖后会卸载并断言不存在 `uvloop`,Tester 镜像从一开始就不安装,最终两种镜像都不得包含它。这些设置用于排除可选事件循环实现,不是 CPU 亲和性或 Turbo 规避,也不放宽容器 seccomp。Tester 镜像使用 `--only-binary=:all:` 安装依赖;SDK 0.5.6 的最低兼容版本是 Python 3.11,`websockets` 约束是 `>=13.0,<15`。镜像构建末尾必须执行 `python -m pip check`,业务测试阶段不得临时 `pip install`。
|
|
287
|
+
|
|
288
|
+
开始业务测试前可执行稳定性探针:
|
|
289
|
+
|
|
290
|
+
```powershell
|
|
291
|
+
docker exec kite-python-sdk-tester sh -lc '
|
|
292
|
+
grep -q "^VERSION_CODENAME=bookworm$" /etc/os-release &&
|
|
293
|
+
test "$PYTHONDONTWRITEBYTECODE" = 1 &&
|
|
294
|
+
test "$PYTHONPYCACHEPREFIX" = /tmp/aun-python-pycache-disabled &&
|
|
295
|
+
test "$PYTHONMALLOC" = malloc &&
|
|
296
|
+
test "$AUN_SDK_UVLOOP" = 0 &&
|
|
297
|
+
test "$AUN_CLI_UVLOOP" = 0 &&
|
|
298
|
+
test "$AUN_BENCH_UVLOOP" = 0 &&
|
|
299
|
+
python -X utf8 -c "import importlib.util; assert importlib.util.find_spec(\"uvloop\") is None" &&
|
|
300
|
+
python -X utf8 -m pip check &&
|
|
301
|
+
i=1; while [ $i -le 100 ]; do
|
|
302
|
+
timeout 20 python -X utf8 -c "import aun_core,aun_cli,aiohttp,cryptography.x509" || exit $?
|
|
303
|
+
i=$((i+1))
|
|
304
|
+
done'
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
若镜像不是 Bookworm,或探针仍出现随机 `SIGSEGV`、标准库导入报出不可能成立的 `TypeError` / `SystemError`,说明 Docker Python 执行器在 SDK/RPC 之前仍已失效,立即停止业务测试并保留退出码、镜像 ID、基础镜像的 `/etc/os-release`、`docker inspect` 和服务日志;不要把它判定为 SDK 断言失败,也不要用 CPU 亲和性、宿主机 Turbo 或 `seccomp=unconfined` 掩盖问题。确认镜像依赖和 Docker 运行态后,只允许按“一次性准备”重建 `sdk-tester`,再只 recreate `python-sdk-tester`。不得删除 `/data/aun`、`/data/aun-fixed-agentid-pub`、宿主机身份目录或数据库来处理该问题。
|
|
308
|
+
|
|
309
|
+
当前默认单实例 `kite-python-sdk-tester` 环境变量:
|
|
310
|
+
|
|
311
|
+
- `AUN_TEST_AUN_PATH=/data/aun-fixed-agentid-pub`
|
|
312
|
+
- `AUN_DATA_ROOT=/data/aun`
|
|
313
|
+
|
|
314
|
+
默认单实例固定身份的**唯一有效目录**是:
|
|
315
|
+
|
|
316
|
+
- 容器内:`/data/aun-fixed-agentid-pub`
|
|
317
|
+
- 宿主机:`D:\modelunion\kite\docker-deploy\data\extended-acceptance\group-management`
|
|
318
|
+
|
|
319
|
+
`docker-compose.testers.yml`、默认单实例固定 AID 测试脚本和本文档都必须以这条路径为唯一真源。`data/sdk-tester-aun/single-domain/persistent` 中的同名 Alice/Bobb/Charlie 是旧证书,不能与当前 `data/mysql` 组合使用;否则登录会返回 `certificate mismatch with server record`。
|
|
320
|
+
|
|
321
|
+
如果历史目录中还残留 `single-domain/AIDs/...`,应视为旧格式脏数据,不再继续复用,也不要把其中的文件和 `persistent` 目录混拷。
|
|
322
|
+
|
|
323
|
+
### agentid.cn 本地跨域对端
|
|
324
|
+
|
|
325
|
+
`agentid.cn` 是当前本地 `agentid.pub` 的跨域 Docker 对端,不再使用历史 `evolagent.cn`。先只读校验固定材料和独立端口覆盖;以下命令不会创建身份,也不会修改数据库:
|
|
326
|
+
|
|
327
|
+
```powershell
|
|
328
|
+
cd D:\modelunion\kite\docker-deploy
|
|
329
|
+
python scripts\domain_materials.py validate agentid.cn\materials.json
|
|
330
|
+
docker image inspect docker-deploy-kite:latest mysql:8.0 redis:7-alpine | Out-Null
|
|
331
|
+
if ($LASTEXITCODE -ne 0) { throw 'agentid.cn 服务端镜像未完成离线准备,停止测试' }
|
|
332
|
+
docker compose --env-file agentid.cn/local.env --project-directory . `
|
|
333
|
+
-f docker-compose.yml -f agentid.cn/docker-compose.yml config --quiet
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
解析后的服务端数据源必须全部位于 `data-agentid-cn`。Issuer CA 指纹、10 个服务 AID 和 MySQL `server-uuid` 由 `agentid.cn/materials.json` 锁定;不得从 `data` 复制 `agentid.pub` 的 Issuer、服务身份或数据库来补缺。
|
|
337
|
+
|
|
338
|
+
`agentid.cn` Tester 使用独立 project、容器名、网络和可写目录,不与 `agentid.pub` 共享 SDK 身份。单域测试可按该域 `local.env` 启动;真实双域测试不能只启动这个 Tester,完整拓扑、固定身份规则与验收顺序见分布式指南:
|
|
339
|
+
|
|
340
|
+
```powershell
|
|
341
|
+
$required = @(
|
|
342
|
+
'kite-agentid-cn-python-sdk-tester', 'kite-agentid-cn-go-tester',
|
|
343
|
+
'kite-agentid-cn-ts-tester', 'kite-agentid-cn-js-tester'
|
|
344
|
+
)
|
|
345
|
+
$existing = docker ps -a --format '{{.Names}}'
|
|
346
|
+
$missing = $required | Where-Object { $_ -notin $existing }
|
|
347
|
+
if ($missing) { throw "agentid.cn Tester 尚未完成离线依赖准备: $($missing -join ', ')" }
|
|
348
|
+
docker compose --env-file agentid.cn/local.env --project-directory . `
|
|
349
|
+
-f docker-compose.testers.yml start
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
`agentid.cn` 使用 42xxx 宿主端口和 8406 MySQL 端口,可以与 `agentid.pub` 并行。跨域测试必须按分布式指南对两个 project 同时加载 federation overlay;只启动两个独立单域 project 并不构成跨域环境。
|
|
353
|
+
|
|
354
|
+
### 跨语言容器 E2E(Python / TypeScript / Go / JavaScript)
|
|
355
|
+
|
|
356
|
+
跨语言容器 E2E 使用独立 Compose overlay:
|
|
357
|
+
|
|
358
|
+
```text
|
|
359
|
+
D:\modelunion\kite\aun-sdk-core\tests\cross-sdk\docker-compose.cross-sdk.yml
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
该环境会启动五个测试容器:
|
|
363
|
+
|
|
364
|
+
| 容器 | 作用 |
|
|
365
|
+
| --- | --- |
|
|
366
|
+
| `cross-sdk-python` | Python SDK 长连接客户端,暴露 test-control HTTP `:9001` |
|
|
367
|
+
| `cross-sdk-ts` | TypeScript SDK 长连接客户端,暴露 test-control HTTP `:9001` |
|
|
368
|
+
| `cross-sdk-go` | Go SDK 长连接客户端,暴露 test-control HTTP `:9001` |
|
|
369
|
+
| `cross-sdk-js` | JavaScript SDK 长连接客户端,暴露 test-control HTTP `:9001` |
|
|
370
|
+
| `cross-sdk-runner` | 统一 test-runner,调用各语言客户端的 test-control API 编排用例 |
|
|
371
|
+
|
|
372
|
+
业务消息仍走 AUN Gateway:
|
|
373
|
+
|
|
374
|
+
```text
|
|
375
|
+
cross-sdk-python / cross-sdk-ts / cross-sdk-go / cross-sdk-js
|
|
376
|
+
-> kite-app/gateway
|
|
377
|
+
-> cross-sdk-python / cross-sdk-ts / cross-sdk-go / cross-sdk-js
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
测试控制命令走容器内 HTTP:
|
|
381
|
+
|
|
382
|
+
```text
|
|
383
|
+
cross-sdk-runner -> http://cross-sdk-python:9001
|
|
384
|
+
cross-sdk-runner -> http://cross-sdk-ts:9001
|
|
385
|
+
cross-sdk-runner -> http://cross-sdk-go:9001
|
|
386
|
+
cross-sdk-runner -> http://cross-sdk-js:9001
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
前置条件:
|
|
390
|
+
|
|
391
|
+
- agentid.pub 单实例已按本节域入口启动:`docker compose --env-file agentid.pub/local.env --project-directory . -f docker-compose.yml -f agentid.pub/docker-compose.yml up -d`
|
|
392
|
+
- 已创建专用的 Docker internal 网络 `aun-cross-sdk-local`,并把 `kite-app` 以本地域名 alias 接入;不要复用名称相近但没有服务容器的普通 bridge 网络
|
|
393
|
+
- 已有 `aun-sdk-tester:latest` 镜像
|
|
394
|
+
- TS/JS 的 named volume 中已有可用的 `node_modules/.bin/tsc`;Compose 强制 npm offline,缓存缺失时应停止并在允许联网的依赖准备阶段单独补齐,不能在业务 E2E 期间临时访问 npm registry
|
|
395
|
+
- Go 容器使用本仓库 `go/vendor`,默认不需要联网拉 Go 模块
|
|
396
|
+
|
|
397
|
+
先创建并校验隔离网络。`internal=true` 是硬要求;它保证测试容器即使配置错误也没有公网出口。`kite-app` 每次被 `--force-recreate` 后都要重新执行连接步骤,因为手工附加的网络不会继承到新容器:
|
|
398
|
+
|
|
399
|
+
```powershell
|
|
400
|
+
$network = "aun-cross-sdk-local"
|
|
401
|
+
$exists = docker network ls --filter "name=^$network$" --format "{{.Name}}"
|
|
402
|
+
if (-not $exists) {
|
|
403
|
+
docker network create --driver bridge --internal $network
|
|
404
|
+
}
|
|
405
|
+
$internal = docker network inspect $network --format "{{.Internal}}"
|
|
406
|
+
if ($internal -ne "true") {
|
|
407
|
+
throw "跨 SDK 测试网络必须是 internal=true: $network"
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
$networks = (docker inspect kite-app | ConvertFrom-Json)[0].NetworkSettings.Networks.PSObject.Properties.Name
|
|
411
|
+
if ($networks -notcontains $network) {
|
|
412
|
+
docker network connect `
|
|
413
|
+
--alias kite-app `
|
|
414
|
+
--alias agentid.pub `
|
|
415
|
+
--alias gateway.agentid.pub `
|
|
416
|
+
--alias aun_console.agentid.pub `
|
|
417
|
+
--alias storage.agentid.pub `
|
|
418
|
+
--alias group.agentid.pub `
|
|
419
|
+
$network kite-app
|
|
420
|
+
}
|
|
421
|
+
$env:AUN_DOCKER_NETWORK = $network
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
每轮启动前显式生成四个唯一测试 AID。不要使用 Compose 中为历史兼容保留的 `cross-py.agentid.pub`、`cross-ts.agentid.pub`、`cross-go.agentid.pub` 默认值;这些固定名称可能与服务端已有证书冲突:
|
|
425
|
+
|
|
426
|
+
```powershell
|
|
427
|
+
$runId = Get-Date -Format "MMddHHmmss"
|
|
428
|
+
$env:CROSS_SDK_PY_AID = "winpy-$runId.agentid.pub"
|
|
429
|
+
$env:CROSS_SDK_TS_AID = "wints-$runId.agentid.pub"
|
|
430
|
+
$env:CROSS_SDK_GO_AID = "wingo-$runId.agentid.pub"
|
|
431
|
+
$env:CROSS_SDK_JS_AID = "winjs-$runId.agentid.pub"
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
Compose 在创建或重建 agent 容器时读取这些宿主机变量;`docker compose restart` 不会重新读取。变量变更后使用 `up --force-recreate`。Python、TypeScript、Go 的测试身份落在各自 `tests/cross-sdk/data/` 目录;JavaScript test agent 使用内存 IndexedDB,进程或容器重建后私钥即丢失,因此每次重建 JS agent 都必须换一个新的 `CROSS_SDK_JS_AID`,不能拿已登记证书的旧 AID 重新生成身份。启动、重跑和清理应在同一个 PowerShell 会话中进行;如果换了会话,先重新执行本段和后面的网络预检变量初始化。
|
|
435
|
+
|
|
436
|
+
启动 agent 前必须做 DNS 和 HTTPS discovery 预检,解析结果必须等于 `kite-app` 在该 internal 网络中的 IP。若解析成公网 IP(例如 `43.*`)或其他容器,立即停止;Compose 内的 `ensure-local-network.sh` 也会在 agent 启动前执行同一类保护并以退出码 `78` 拒绝运行:
|
|
437
|
+
|
|
438
|
+
```powershell
|
|
439
|
+
$networkInfo = (docker inspect kite-app | ConvertFrom-Json)[0].NetworkSettings.Networks.PSObject.Properties[$env:AUN_DOCKER_NETWORK].Value
|
|
440
|
+
$env:EXPECTED_GATEWAY_IP = $networkInfo.IPAddress
|
|
441
|
+
docker run --rm --network $env:AUN_DOCKER_NETWORK `
|
|
442
|
+
-e EXPECTED_GATEWAY_IP `
|
|
443
|
+
-e HTTP_PROXY= -e HTTPS_PROXY= -e ALL_PROXY= -e NO_PROXY=* `
|
|
444
|
+
aun-sdk-tester:latest python -c `
|
|
445
|
+
"import os,socket,ssl,urllib.request; ip=socket.gethostbyname('gateway.agentid.pub'); assert ip==os.environ['EXPECTED_GATEWAY_IP'], (ip,os.environ['EXPECTED_GATEWAY_IP']); r=urllib.request.urlopen('https://gateway.agentid.pub/.well-known/aun-gateway',context=ssl._create_unverified_context(),timeout=5); assert r.status==200; print('local gateway ok',ip,r.status)"
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
预检通过后再执行。Compose 也会校验 `EXPECTED_GATEWAY_IP`;启动块先重新从运行中的
|
|
449
|
+
`kite-app` 读取该值,因此即使在新的 PowerShell 会话中执行也不会因遗漏环境变量而启动失败:
|
|
450
|
+
|
|
451
|
+
```powershell
|
|
452
|
+
cd D:\modelunion\kite\aun-sdk-core
|
|
453
|
+
$env:AUN_DOCKER_NETWORK = "aun-cross-sdk-local"
|
|
454
|
+
$networkInfo = (docker inspect kite-app | ConvertFrom-Json)[0].NetworkSettings.Networks.PSObject.Properties[$env:AUN_DOCKER_NETWORK].Value
|
|
455
|
+
$env:EXPECTED_GATEWAY_IP = $networkInfo.IPAddress
|
|
456
|
+
docker image inspect aun-sdk-tester:latest node:22-bookworm golang:1.24-bookworm | Out-Null
|
|
457
|
+
if ($LASTEXITCODE -ne 0) { throw 'cross-SDK 镜像未完成离线准备,停止测试' }
|
|
458
|
+
docker compose -f tests/cross-sdk/docker-compose.cross-sdk.yml up --force-recreate --abort-on-container-exit --exit-code-from cross-sdk-runner
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
只定向验收 Tail / History / Forward、A/T/H、Push Tail、重启恢复和坏密文推进时,使用:
|
|
462
|
+
|
|
463
|
+
```powershell
|
|
464
|
+
$env:CROSS_SDK_CASES_BASENAME = "cases.message-windows.json"
|
|
465
|
+
docker compose -f tests/cross-sdk/docker-compose.cross-sdk.yml up --force-recreate --abort-on-container-exit --exit-code-from cross-sdk-runner
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
该场景按 Python → TypeScript → Go → JavaScript 串行执行,不要并发启动多份 runner。身份和游标隔离使用上面的四个唯一 AID;不得通过删除本地身份目录或清库实现隔离。
|
|
469
|
+
`cases.message-windows.json` 属于本地 Git 忽略测试材料。其 `history_e2ee` 默认应为 `true`;若为隔离已知 E2EE 收件超时而临时设为 `false`,报告只能作为 Tail / History / Forward 主线验收,不能据此宣称 E2EE 通过。
|
|
470
|
+
|
|
471
|
+
仅验证 Group/Storage 改动影响的 `group.fs.*` 二跳调用链时,使用现成的定向矩阵,避免重复运行已通过的 storage 或消息用例:
|
|
472
|
+
|
|
473
|
+
```powershell
|
|
474
|
+
$env:CROSS_SDK_CASES_BASENAME = "cases.group-fs-only.json"
|
|
475
|
+
docker compose -f tests/cross-sdk/docker-compose.cross-sdk.yml up --force-recreate --abort-on-container-exit --exit-code-from cross-sdk-runner
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
该矩阵包含 Python、TypeScript、Go、JavaScript 的群自有区读写、成员 `memberdata` 读写,以及四种 owner 的 POSIX/mount 权限边界。
|
|
479
|
+
|
|
480
|
+
当前用例配置:
|
|
481
|
+
|
|
482
|
+
```text
|
|
483
|
+
tests/cross-sdk/cases.single-domain.json
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
默认覆盖 group.index、消息、群聊、storage、group.fs、collab 等跨 SDK 场景:
|
|
487
|
+
|
|
488
|
+
- `health_ready`
|
|
489
|
+
- P2P 明文有向矩阵:Python / TS / Go / JS 四个 SDK 两两互发,覆盖 12 个方向
|
|
490
|
+
- P2P E2EE 有向矩阵:Python / TS / Go / JS 四个 SDK 两两互发,覆盖 12 个方向
|
|
491
|
+
- P2P E2EE 连续 3 条:Python -> TS、TS -> Python、Go -> Python
|
|
492
|
+
- P2P 明文连续 5 条 + ack:Python -> TS、TS -> Python
|
|
493
|
+
- P2P E2EE 双向 roundtrip + ack:Python <-> TS、Go <-> TS
|
|
494
|
+
- P2P E2EE Unicode/换行消息 + ack:Python -> TS
|
|
495
|
+
- P2P E2EE 预期失败:JS -> 缺失 AID,验证错误不会静默成功
|
|
496
|
+
- 群聊明文 pairwise 有向矩阵:Python / TS / Go / JS 四个 SDK 两两建群互发,覆盖 12 个方向
|
|
497
|
+
- 群聊 E2EE pairwise 有向矩阵:Python / TS / Go / JS 四个 SDK 两两建群互发,覆盖 12 个方向
|
|
498
|
+
- 三成员同群明文矩阵:`group_plain_matrix_python_ts_go` 创建同一个群,拉入 Python / TS / Go 三个 SDK agent,每个 SDK 各发一条,其他两个 SDK 接收,覆盖 3x2 接收关系
|
|
499
|
+
- 三成员同群 E2EE 矩阵:`group_e2ee_matrix_python_ts_go` 创建同一个群,拉入 Python / TS / Go 三个 SDK agent,每个 SDK 各发一条加密消息,其他两个 SDK 解密接收,覆盖 3x2 接收关系
|
|
500
|
+
- 四成员同群明文矩阵:`group_plain_matrix_python_ts_go_js` 创建同一个群,拉入 Python / TS / Go / JS 四个 SDK agent,每个 SDK 各发一条,其他三个 SDK 接收,覆盖 4x3 接收关系
|
|
501
|
+
- 四成员同群 E2EE 矩阵:`group_e2ee_matrix_python_ts_go_js` 创建同一个群,拉入 Python / TS / Go / JS 四个 SDK agent,每个 SDK 各发一条加密消息,其他三个 SDK 解密接收,覆盖 4x3 接收关系
|
|
502
|
+
- storage 四语言互操作矩阵:`storage_ticket_matrix_python_ts_go_js` 覆盖四语言写入、ACL 授权读取、下载 ticket 和 URL 下载;`storage_acl_matrix_python_ts_go_js` 轮换 writer/reader,覆盖未授权读失败、只读 ACL 可读不可写、ACL 撤销后读失败
|
|
503
|
+
- group.fs 四语言互操作矩阵:`group_fs_matrix_python_ts_go_js` 创建同一个命名群,拉入 Python / TS / Go / JS 四个 SDK agent;Python owner 以 group_aid 签名写群自有区,TS/Go/JS 读取;TS/Go/JS 各自写入 `memberdata/{aid}`,Python owner 读取,覆盖 group_aid 源根、下载和 memberdata 互操作
|
|
504
|
+
- group.fs POSIX 矩阵:`group_fs_posix_matrix_python_ts_go_js` 覆盖 `mkdir/ls/find/stat/lstat/df/cp/mv/rm/mount/umount`、本地上传/下载、远端复制/移动/删除、成员 `memberdata/{aid}` 挂载/卸载,以及非 owner 写群自有区、写他人 memberdata 槽位的权限拒绝
|
|
505
|
+
- group.index 四语言互操作矩阵:覆盖 owner/admin SDK 生成签名 `group.index`、`expected_index_etag` CAS push、`_meta.group_indexes` stale 观察、`getGroupIndex` 摘取、便利写入 `updateAnnouncement/updateRules/updateJoinRequirements` 走 `updateGroupIndex`、以及 etag 冲突后的重新读取与重试
|
|
506
|
+
- collab 四语言互操作矩阵:`collab_matrix_python_ts_go_js` 覆盖 create/read/submit/history/get/diff/snapshot/merge/discover;`collab_acl_matrix_python_ts_go_js` 覆盖 collab root ACL 的读写边界、未授权读取失败、只读者提交失败、授权后读取成功、撤销后读取失败
|
|
507
|
+
- 群聊明文连续 3 条 + ack:Python -> TS、Go -> TS
|
|
508
|
+
- 群聊 E2EE 连续 3 条 + ack:TS -> Python
|
|
509
|
+
- 群聊 E2EE 双向 roundtrip + ack:Python <-> TS、Go <-> Python
|
|
510
|
+
- 群聊 E2EE 预期失败:JS 非成员向 Python 创建、TS 参与的群发送,验证错误不会静默成功
|
|
511
|
+
- 同一个群内混合明文/E2EE 双向发送 + ack:Python <-> TS、Go <-> TS
|
|
512
|
+
|
|
513
|
+
运行结果以本次生成的 `tests/cross-sdk/artifacts/results.json` 为准。注意:该文件会被不同 `CROSS_SDK_CASES_BASENAME` 覆盖,不能用旧产物反推当前默认用例全部通过。Compose 使用 `--abort-on-container-exit`,runner 结束后会停止各语言长连接客户端,客户端容器的停止退出码不作为测试结果判断依据。
|
|
514
|
+
|
|
515
|
+
测试产物:
|
|
516
|
+
|
|
517
|
+
| 路径 | 内容 |
|
|
518
|
+
| --- | --- |
|
|
519
|
+
| `tests/cross-sdk/artifacts/results.json` | 汇总结果 |
|
|
520
|
+
| `tests/cross-sdk/artifacts/results.jsonl` | 每行一个用例结果,方便 CI 解析 |
|
|
521
|
+
| `tests/cross-sdk/artifacts/logs/python/` | Python SDK 日志 |
|
|
522
|
+
| `tests/cross-sdk/artifacts/logs/ts/` | TypeScript SDK 日志 |
|
|
523
|
+
| `tests/cross-sdk/artifacts/logs/go/` | Go SDK 日志 |
|
|
524
|
+
| `tests/cross-sdk/artifacts/logs/js/` | JavaScript SDK 日志 |
|
|
525
|
+
| `tests/cross-sdk/data/python/` | Python 客户端独立 AUN 数据目录 |
|
|
526
|
+
| `tests/cross-sdk/data/ts/` | TS 客户端独立 AUN 数据目录 |
|
|
527
|
+
| `tests/cross-sdk/data/go/` | Go 客户端独立 AUN 数据目录 |
|
|
528
|
+
| `tests/cross-sdk/data/js/` | JS 客户端独立 AUN 数据目录 |
|
|
529
|
+
|
|
530
|
+
查看结果:
|
|
531
|
+
|
|
532
|
+
```powershell
|
|
533
|
+
Get-Content tests/cross-sdk/artifacts/results.json
|
|
534
|
+
Get-Content tests/cross-sdk/artifacts/results.jsonl
|
|
535
|
+
docker logs cross-sdk-runner
|
|
536
|
+
docker logs cross-sdk-python
|
|
537
|
+
docker logs cross-sdk-ts
|
|
538
|
+
docker logs cross-sdk-go
|
|
539
|
+
docker logs cross-sdk-js
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
清理测试容器:保持本轮 `CROSS_SDK_*_AID`、`AUN_DOCKER_NETWORK` 和
|
|
543
|
+
`EXPECTED_GATEWAY_IP` 变量仍在当前 PowerShell 会话;若已换会话,先重新执行上面的 AID
|
|
544
|
+
初始化与预检初始化块。Compose 必须先完成变量插值才能执行 `down`:
|
|
545
|
+
|
|
546
|
+
```powershell
|
|
547
|
+
docker compose -f tests/cross-sdk/docker-compose.cross-sdk.yml down
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
不要加 `-v`,除非明确要删除 `cross-sdk-ts-node-modules`、`cross-sdk-js-node-modules`、`cross-sdk-go-cache` 等 volume 并让容器下次重新安装或重新编译缓存。`tests/cross-sdk/data/` 下保存的是跨语言测试客户端的独立身份和本地状态,排查问题时应保留。
|
|
551
|
+
|
|
552
|
+
### 进入测试容器
|
|
553
|
+
|
|
554
|
+
```powershell
|
|
555
|
+
docker exec -it kite-python-sdk-tester sh
|
|
556
|
+
docker exec -it kite-ts-tester bash
|
|
557
|
+
docker exec -it kite-go-tester sh
|
|
558
|
+
docker exec -it kite-js-tester bash
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
容器内约定:
|
|
562
|
+
|
|
563
|
+
- SDK 源码:`/sdk/src`
|
|
564
|
+
- 测试目录:`/tests`
|
|
565
|
+
- `PYTHONPATH=/sdk/src`
|
|
566
|
+
- 默认 agentid.pub 固定身份目录使用 `/data/aun-fixed-agentid-pub`
|
|
567
|
+
- `kite-python-sdk-tester` 额外挂载 SDK 仓库根到 `/workspace/aun-sdk-core:ro`,并设置 `AUN_REPO_ROOT=/workspace/aun-sdk-core`、`PYTHONPATH=/sdk/src:/tests`;依赖仓库根脚本或测试 helper 的单元测试必须从这些显式路径读取,不能根据容器内 `/tests` 的父目录猜测仓库位置。
|
|
568
|
+
- 四语言 Tester 都把 `aun-sdk-core/tests/contracts` 只读挂载到 `/contracts`,并设置 `AUN_CONTRACTS_ROOT=/contracts`;A/T/H 等跨 SDK 共享向量必须读取该路径。
|
|
569
|
+
- `kite-ts-tester` 挂载 `D:\modelunion\kite\aun-sdk-core\ts -> /workspace/ts`
|
|
570
|
+
- `kite-ts-tester` 的 `/workspace/ts/node_modules` 使用容器内独立 volume,与宿主机 Windows `node_modules` 隔离
|
|
571
|
+
- `kite-ts-tester` 使用独立的数据目录(`/data/aun`),不与 Python `kite-python-sdk-tester` 共享身份数据。Python SDK 使用标准库 `sqlite3`,TS SDK 使用 `better-sqlite3`;各 SDK 独立拥有本地状态和 schema,不得共享身份数据目录。
|
|
572
|
+
- `kite-go-tester` 挂载 `D:\modelunion\kite\aun-sdk-core\go -> /workspace/go`
|
|
573
|
+
- `kite-js-tester` 挂载 `D:\modelunion\kite\aun-sdk-core\js -> /workspace/js`,并使用独立的 `node_modules` volume 和 `/data/aun` 数据目录
|
|
574
|
+
|
|
575
|
+
### 典型测试命令
|
|
576
|
+
|
|
577
|
+
直接运行脚本:
|
|
578
|
+
|
|
579
|
+
```powershell
|
|
580
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/integration_test_stream.py
|
|
581
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/test_integration_auth_flow.py
|
|
582
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/integration_test_message_ack.py
|
|
583
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/integration_test_gap_fill.py
|
|
584
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/e2e_test_v2_p2p_e2ee.py
|
|
585
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/e2e_test_v2_multi_device.py
|
|
586
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/e2e_test_slot_id_separator.py
|
|
587
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/e2e_test_group_online_unread_chain.py
|
|
588
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/integration_test_group_recall.py
|
|
589
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/integration_test_group_index.py
|
|
590
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/e2e_test_group_index.py
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
其中默认单实例固定 AID 测试脚本由 Compose 显式传入 `AUN_TEST_AUN_PATH=/data/aun-fixed-agentid-pub`。不要退回 `AUN_DATA_ROOT/single-domain/persistent`;该旧目录的同名证书与当前 MySQL 活动记录不匹配。
|
|
594
|
+
|
|
595
|
+
message / group 服务端改动后的最小 Docker 回归组合:
|
|
596
|
+
|
|
597
|
+
```powershell
|
|
598
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/integration_test_message_ack.py
|
|
599
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/integration_test_gap_fill.py
|
|
600
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/e2e_test_v2_p2p_e2ee.py
|
|
601
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/e2e_test_v2_multi_device.py
|
|
602
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/e2e_test_slot_id_separator.py
|
|
603
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/e2e_test_group_online_unread_chain.py
|
|
604
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/integration_test_group_recall.py
|
|
605
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/integration_test_group_index.py
|
|
606
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/e2e_test_group_index.py
|
|
607
|
+
docker exec -w /workspace/ts kite-ts-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded node_modules/vitest/vitest.mjs run tests/integration/message-gap.test.ts tests/integration/group-gap.test.ts
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
这组用例覆盖 message ack、P2P / group gap、V2 P2P E2EE、多设备、Group E2EE slot 隔离、在线 unread 链、recall、group.index 签名/CAS/meta 观察,以及 TS SDK gap 行为。
|
|
611
|
+
|
|
612
|
+
group.index 相关改动的四语言最小回归:
|
|
613
|
+
|
|
614
|
+
```powershell
|
|
615
|
+
# Python
|
|
616
|
+
docker exec kite-python-sdk-tester python -X utf8 -m pytest /tests/unit/test_group_index.py /tests/unit/test_group_index_facade.py -v --tb=short
|
|
617
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/integration_test_group_index.py
|
|
618
|
+
docker exec kite-python-sdk-tester python -X utf8 /tests/e2e_test_group_index.py
|
|
619
|
+
|
|
620
|
+
# TypeScript
|
|
621
|
+
docker exec -w /workspace/ts kite-ts-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded node_modules/vitest/vitest.mjs run tests/unit/group-index.test.ts tests/unit/group-index-facade.test.ts tests/integration/group-index.test.ts
|
|
622
|
+
|
|
623
|
+
# Go
|
|
624
|
+
docker exec -w /workspace/go kite-go-tester sh -lc "go test . -run 'GroupIndex|IntegrationGroupIndex' -count=1 -v"
|
|
625
|
+
|
|
626
|
+
# JavaScript:容器内禁用 127.0.0.1 pin,改用 Docker DNS
|
|
627
|
+
docker exec -w /workspace/js kite-js-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded node_modules/vitest/vitest.mjs run --environment jsdom tests/unit/group-index.test.ts tests/unit/group-index-facade.test.ts
|
|
628
|
+
docker exec -e AUN_TEST_DISABLE_LOCAL_DOCKER_PIN=1 -w /workspace/js kite-js-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded node_modules/@playwright/test/cli.js test --config=playwright.agentid-local.config.ts tests/e2e-browser/group-index.spec.ts --reporter=line
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
如果本轮同时修改了 `extensions/services/group`,先在 `D:\modelunion\kite\docker-deploy` 重新 build 并重启 `kite` 服务容器,再运行上述集成/E2E。
|
|
632
|
+
|
|
633
|
+
message / group WAL 与异步批量写入当前默认开启,跑上述回归前不需要额外设置开关。若本轮改动涉及 WAL replay、批量 flush、ack/cursor 合并或 group fanout,除了看测试结果,还应按“故障排查”章节确认 `kite-app` 日志里 writer 已启动且没有批量写入异常。
|
|
634
|
+
|
|
635
|
+
### Mail 专项验收
|
|
636
|
+
|
|
637
|
+
Mail 客户端只调用 AUN `mail.*` RPC。真实外发只开启 Mail 服务端的 SMTP 出站 relay,
|
|
638
|
+
不得开启 SMTP Submission、IMAP 或入站 SMTP。163 账号必须先在网页设置中开启
|
|
639
|
+
POP3/SMTP/IMAP 服务并生成独立的 SMTP 客户端授权码;网页登录密码不能替代授权码。
|
|
640
|
+
|
|
641
|
+
服务端代码变更后先按“服务端代码变更”重建镜像。随后在同一个 PowerShell 会话中
|
|
642
|
+
安全输入授权码并重建 `kite` 容器:
|
|
643
|
+
|
|
644
|
+
```powershell
|
|
645
|
+
cd D:\modelunion\kite\docker-deploy
|
|
646
|
+
$relayCredential = Get-Credential -UserName 'readytogo@163.com' `
|
|
647
|
+
-Message '请输入 163 SMTP 客户端授权码(不是网页登录密码)'
|
|
648
|
+
$env:MAIL_SMTP_OUTBOUND_RELAY = 'smtp.163.com:465'
|
|
649
|
+
$env:MAIL_SMTP_OUTBOUND_TLS_MODE = 'implicit'
|
|
650
|
+
$env:MAIL_SMTP_OUTBOUND_RELAY_USER = 'readytogo@163.com'
|
|
651
|
+
$env:MAIL_SMTP_OUTBOUND_RELAY_PASS = $relayCredential.GetNetworkCredential().Password
|
|
652
|
+
$env:MAIL_SMTP_OUTBOUND_RELAY_ENVELOPE_FROM = 'readytogo@163.com'
|
|
653
|
+
$env:MAIL_SMTP_OUTBOUND_ALLOW_INSECURE = 'false'
|
|
654
|
+
|
|
655
|
+
docker compose --env-file agentid.pub/local.env --project-directory . `
|
|
656
|
+
-f docker-compose.yml -f agentid.pub/docker-compose.yml `
|
|
657
|
+
up -d --force-recreate --no-deps kite
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
确认 Mail 已 ready、Python Tester 已启动后,通过 AUN RPC 发送一封幂等测试邮件:
|
|
661
|
+
|
|
662
|
+
```powershell
|
|
663
|
+
$testId = '163-' + (Get-Date -Format 'yyyyMMdd-HHmmss')
|
|
664
|
+
docker exec `
|
|
665
|
+
-e AUN_MAIL_ENABLE_REAL_SMTP=1 `
|
|
666
|
+
-e AUN_MAIL_REAL_SMTP_RECIPIENT=readytogo@163.com `
|
|
667
|
+
-e AUN_MAIL_REAL_SMTP_TEST_ID=$testId `
|
|
668
|
+
kite-python-sdk-tester `
|
|
669
|
+
python -X utf8 /tests/integration_test_mail_real_smtp.py
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
脚本只调用 `mail.status/send/get`,不读取 relay 凭据,也不连接 SMTP/IMAP。脚本输出
|
|
673
|
+
`delivered` 只表示 163 MTA 已返回成功响应,仍需人工检查收件箱和垃圾箱;
|
|
674
|
+
`accepted_unknown` 禁止自动重发。若这只是一次验收,结束后必须清除变量并重建 `kite`,
|
|
675
|
+
恢复默认 AUN RPC-only 模式;只清除当前 PowerShell 变量不会改变已运行容器的环境:
|
|
676
|
+
|
|
677
|
+
```powershell
|
|
678
|
+
$mailRelayVars = @(
|
|
679
|
+
'MAIL_SMTP_OUTBOUND_RELAY',
|
|
680
|
+
'MAIL_SMTP_OUTBOUND_TLS_MODE',
|
|
681
|
+
'MAIL_SMTP_OUTBOUND_RELAY_USER',
|
|
682
|
+
'MAIL_SMTP_OUTBOUND_RELAY_PASS',
|
|
683
|
+
'MAIL_SMTP_OUTBOUND_RELAY_ENVELOPE_FROM',
|
|
684
|
+
'MAIL_SMTP_OUTBOUND_ALLOW_INSECURE'
|
|
685
|
+
)
|
|
686
|
+
$mailRelayVars | ForEach-Object {
|
|
687
|
+
Remove-Item "Env:$_" -ErrorAction SilentlyContinue
|
|
688
|
+
}
|
|
689
|
+
$relayCredential = $null
|
|
690
|
+
docker compose --env-file agentid.pub/local.env --project-directory . `
|
|
691
|
+
-f docker-compose.yml -f agentid.pub/docker-compose.yml `
|
|
692
|
+
up -d --force-recreate --no-deps kite
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
需要长期保留外发 bridge 时,不执行上述重建关闭步骤,但必须改由部署 secret 管理授权码,
|
|
696
|
+
不能把授权码写入仓库、Compose 或普通 `.env` 文件。
|
|
697
|
+
|
|
698
|
+
若返回 `SMTP AUTH 失败` 或 5xx,先检查 163 SMTP 服务和客户端授权码;若返回网络或 TLS
|
|
699
|
+
错误,再检查容器公网出口和 `smtp.163.com:465`。不得通过启用明文降级绕过 TLS 错误。
|
|
700
|
+
|
|
701
|
+
### P2P bench 标准流程
|
|
702
|
+
|
|
703
|
+
bench 用于性能验证,不替代正确性回归。服务端代码或配置改动后,必须先把改动烘进 `docker-deploy-kite:latest` 并重建 `kite-app`,否则测到的可能是旧镜像:
|
|
704
|
+
|
|
705
|
+
```powershell
|
|
706
|
+
cd D:\modelunion\kite\docker-deploy
|
|
707
|
+
docker compose --env-file NUL -f docker-compose.build.yml build kite
|
|
708
|
+
docker compose --env-file agentid.pub/local.env --project-directory . -f docker-compose.yml -f agentid.pub/docker-compose.yml up -d --force-recreate --no-deps kite
|
|
709
|
+
docker logs --tail 160 kite-app
|
|
710
|
+
```
|
|
711
|
+
|
|
712
|
+
确认日志里关键参数已经生效,例如 message WAL writer 输出 `batch_size=500, max_batch_size=1000`,message `db_writer_shards=2`,`wal_max_pending=8000`,`ack_coalesce_window_ms=100`,P2P 活跃设备 L1/L2 热缓存为开启状态。如果只改 SDK bench 脚本,不需要重建服务镜像。
|
|
713
|
+
|
|
714
|
+
P2P bench 应在 Docker 网络内运行,优先使用 `kite-python-sdk-tester` 容器和固定 32 对 bench AID,避免宿主机 DNS / 证书 / hosts 差异影响结果。发送前先 drain 接收端,避免历史积压污染本轮统计:
|
|
715
|
+
|
|
716
|
+
```powershell
|
|
717
|
+
$benchEnv = "AUN_DATA_ROOT=/data/aun/bench-pairs16 AUN_TEST_AUN_PATH=/data/aun/bench-pairs16 AUN_SDK_UVLOOP=0 AUN_CLI_UVLOOP=0 AUN_BENCH_UVLOOP=0"
|
|
718
|
+
$senders = (1..32 | ForEach-Object { "codexdocklane1782701503s{0:D2}.agentid.pub" -f $_ }) -join ","
|
|
719
|
+
$receivers = (1..32 | ForEach-Object { "codexdocklane1782701503r{0:D2}.agentid.pub" -f $_ }) -join ","
|
|
720
|
+
|
|
721
|
+
docker exec kite-python-sdk-tester bash -lc "$benchEnv python -X utf8 -m aun_cli --json bench e2e drain --receivers '$receivers' --limit 100 --max-pages 200"
|
|
722
|
+
docker exec kite-python-sdk-tester bash -lc "$benchEnv python -X utf8 -m aun_cli --json bench e2e send --senders '$senders' --receivers '$receivers' --count 32000 --concurrency 32 --size 64 --drain-receivers --drain-limit 100 --drain-max-pages 200 --timeout-ms 5000"
|
|
723
|
+
```
|
|
724
|
+
|
|
725
|
+
这组 `codexdocklane1782701503s/rXX.agentid.pub` 是性能压测专用身份池,不使用默认单实例固定身份目录。身份材料当前在:
|
|
726
|
+
|
|
727
|
+
- 容器内:`/data/aun/bench-pairs16`
|
|
728
|
+
- 宿主机:`D:\modelunion\kite\docker-deploy\data\sdk-tester-aun\bench-pairs16`
|
|
729
|
+
|
|
730
|
+
因此运行上述硬编码 32 对 AID 时,必须显式设置 `AUN_DATA_ROOT=/data/aun/bench-pairs16` 和 `AUN_TEST_AUN_PATH=/data/aun/bench-pairs16`。普通默认单实例固定身份测试使用 `/data/aun-fixed-agentid-pub`。
|
|
731
|
+
|
|
732
|
+
加密是默认模式;明文对照才加 `--no-encrypt`。标准多进程压测使用 8 个独立 bench 进程,每个进程使用 4 对 AID、`--count 4000 --concurrency 4`,总计 32 对、32000 条。各进程的 sender/receiver 子集不能重叠:
|
|
733
|
+
|
|
734
|
+
需要模拟更接近生产环境的 SDK <-> Gateway 网络 RTT 时,在重建/重启 `kite` 前给 Gateway 设置连接级单向延迟,例如:
|
|
735
|
+
|
|
736
|
+
```powershell
|
|
737
|
+
$env:AUN_GATEWAY_CLIENT_MOCK_NETWORK_DELAY_MS = "25-50"
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
该开关只包裹客户端 WebSocket 连接,不影响 Gateway 到内部服务的连接;未设置或设为 `0` / `off` 时关闭。它用于 bench 口径校准,不应作为生产默认值。
|
|
741
|
+
|
|
742
|
+
```powershell
|
|
743
|
+
$prefix = "p2p32-$(Get-Date -Format yyyyMMdd-HHmmss)"
|
|
744
|
+
$benchEnv = "AUN_DATA_ROOT=/data/aun/bench-pairs16 AUN_TEST_AUN_PATH=/data/aun/bench-pairs16 AUN_SDK_UVLOOP=0 AUN_CLI_UVLOOP=0 AUN_BENCH_UVLOOP=0"
|
|
745
|
+
1..8 | ForEach-Object {
|
|
746
|
+
$start = ($_ - 1) * 4 + 1
|
|
747
|
+
$end = $_ * 4
|
|
748
|
+
$ps = ($start..$end | ForEach-Object { "codexdocklane1782701503s{0:D2}.agentid.pub" -f $_ }) -join ","
|
|
749
|
+
$pr = ($start..$end | ForEach-Object { "codexdocklane1782701503r{0:D2}.agentid.pub" -f $_ }) -join ","
|
|
750
|
+
Start-Job -ScriptBlock {
|
|
751
|
+
param($idx, $senders, $receivers, $prefix, $benchEnv)
|
|
752
|
+
docker exec kite-python-sdk-tester bash -lc "$benchEnv python -X utf8 -m aun_cli --json bench e2e send --senders '$senders' --receivers '$receivers' --count 4000 --concurrency 4 --size 64 --drain-receivers --drain-limit 100 --drain-max-pages 200 --timeout-ms 5000" |
|
|
753
|
+
Set-Content -Encoding utf8 "D:\modelunion\kite\docker-deploy\$prefix-$idx.json"
|
|
754
|
+
} -ArgumentList ($_ - 1), $ps, $pr, $prefix, $benchEnv
|
|
755
|
+
}
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
`--perf-trace` 会聚合服务端 `send_perf` 阶段耗时,默认关闭。只有需要定位分阶段耗时时才在 bench 命令上显式打开;开启后应同步关注 `message/latest.log` 大小,避免 instrumentation 本身污染吞吐数据。
|
|
759
|
+
|
|
760
|
+
bench 期间至少同时采集三类数据:
|
|
761
|
+
|
|
762
|
+
```powershell
|
|
763
|
+
docker stats --no-stream kite-app kite-mysql kite-redis
|
|
764
|
+
docker logs --since 2m kite-app | Select-String "service_status_sample|recent_p2p_cache|v2_pull|WAL writer perf"
|
|
765
|
+
docker exec kite-python-sdk-tester bash -lc "python -X utf8 -m aun_cli --json status"
|
|
766
|
+
```
|
|
767
|
+
|
|
768
|
+
结论里需要同时报告 RPS、send p99、delivery 覆盖、`ordered_gap_blocked`、recent P2P cache 的分子/分母、L1/L2 命中、DB fallback、以及 `v2_pull` 返回消息数。只看 RPS 容易漏掉 push 折叠、gap-fill pull 或 cache 统计异常。
|
|
769
|
+
|
|
770
|
+
运行 pytest:
|
|
771
|
+
|
|
772
|
+
```powershell
|
|
773
|
+
docker exec kite-python-sdk-tester python -m pytest /tests/unit -q -p no:cacheprovider
|
|
774
|
+
docker exec kite-python-sdk-tester python -m pytest /tests/test_integration_auth_flow.py -q -p no:cacheprovider
|
|
775
|
+
```
|
|
776
|
+
|
|
777
|
+
### Service Proxy 默认单实例 E2E
|
|
778
|
+
|
|
779
|
+
Service Proxy 默认单实例 E2E 脚本入口:
|
|
780
|
+
|
|
781
|
+
```powershell
|
|
782
|
+
docker exec kite-python-sdk-tester python /tests/e2e_test_service_proxy_docker.py
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
当前脚本覆盖容器内 HTTP/SSE/WS provider、Python `ServiceProxyClient` embedded registry、NameService `/proxy/{svc}` 跳转、canonical `proxy.{issuer}` URL、HTTP GET/POST、SSE 和 WebSocket subprotocol。
|
|
786
|
+
|
|
787
|
+
运行前置条件:
|
|
788
|
+
|
|
789
|
+
- Docker 镜像包含 `extensions/services/service_proxy` 新模块。
|
|
790
|
+
- `service_proxy` 模块已启用并启动,容器网络内 `http://proxy.agentid.pub:19890/health` 可访问。
|
|
791
|
+
- `/ws/client` 已接入真实 AUN provider 身份认证 resolver;未接入时脚本会明确报认证前置失败。
|
|
792
|
+
|
|
793
|
+
### 离线 Push Service 隔离 PoC
|
|
794
|
+
|
|
795
|
+
Push PoC 使用 `docker-deploy/docker-compose.push-poc.yml` 叠加层、固定只读 PEM 身份和 Python Mock Push Server。Mock 直接使用当前工作区 Python SDK,不读取或创建 `.seed`,也不得修改既有 AID 身份材料。
|
|
796
|
+
|
|
797
|
+
应用登记的推荐路径是 Python `connect()` 携带 `push_notify_aid/push_token`;SDK 建连后调用 `push.register`。运行期更新或注销使用 `client.push.register/unregister`。测试入口为 `python/tests/integration_test_push_service_poc.py`,覆盖 P2P、多设备、registration 更新、注销、聚合、频控、batch、ACK timeout/dedup、迟到 ACK 和迁移恢复等场景。
|
|
798
|
+
|
|
799
|
+
该环境启用明文 token 仅用于隔离 PoC,不能作为生产发布证据。启动 Compose/Kite、重建镜像或变更固定身份前仍需遵守本指南的授权与数据保护规则;发布结论见 [AUN 离线推送服务运维与发布指南](AUN离线推送服务运维与发布指南.md)。
|
|
800
|
+
|
|
801
|
+
### 特别说明:重连测试
|
|
802
|
+
|
|
803
|
+
`python/tests/integration_test_reconnect.py` 需要直接执行这些宿主机命令:
|
|
804
|
+
|
|
805
|
+
- `docker compose restart kite`
|
|
806
|
+
- `docker network disconnect kite-single_kite-net kite-app`
|
|
807
|
+
- `docker network connect kite-single_kite-net kite-app`
|
|
808
|
+
|
|
809
|
+
所以它应在宿主机运行,而不是 `kite-python-sdk-tester` 容器内运行:
|
|
810
|
+
|
|
811
|
+
```powershell
|
|
812
|
+
cd D:\modelunion\kite\aun-sdk-core\python
|
|
813
|
+
python tests/integration_test_reconnect.py
|
|
814
|
+
```
|
|
815
|
+
|
|
816
|
+
运行前要确保宿主机能够解析 `gateway.agentid.pub`。推荐方式不是改 hosts,而是让测试进程也运行在 Docker 网络内;如果必须在宿主机直跑,请确保你已有等效域名解析方案。
|
|
817
|
+
|
|
818
|
+
### TypeScript 集成 / E2E
|
|
819
|
+
|
|
820
|
+
默认单实例提供常驻 `kite-ts-tester` 服务。业务测试只复用依赖已准备完成的容器;不得依赖 entrypoint 在本轮临时下载或修复依赖。
|
|
821
|
+
|
|
822
|
+
当前本机 WSL2 中 Node/V8 会在源码解析或编译阶段随机原生崩溃,限制容器 CPU 集合不能解决。实际 core 已出现 V8 parser `ValidateAndCreateScope()` 内部指针损坏;即使主进程和 Vitest worker 同时使用 `--no-sparkplug,--no-maglev,--no-turbofan,--single-threaded` 仍会复现,因此这些参数只能缩小诊断变量,不能作为稳定性修复。不能使用 `--jitless`,因为它会禁用 Vite 所需的 WebAssembly。若某个未通过文件以 139/SIGSEGV 退出,应保留 core,并用宿主机 Node 对同一文件、同一 Docker 服务端做一次对照;宿主机通过后从下一个文件续跑,不得反复运行已通过文件。TypeScript 构建检查使用:
|
|
823
|
+
|
|
824
|
+
```powershell
|
|
825
|
+
docker exec -w /workspace/ts kite-ts-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded node_modules/typescript/bin/tsc --pretty false
|
|
826
|
+
```
|
|
827
|
+
|
|
828
|
+
默认单实例完整集成回归必须逐文件启动独立 Vitest 进程,避免长时间复用同一个 Node/V8 进程。当前环境不运行双域 `federation*.test.ts` 和宿主机协调型 `reconnect.test.ts`;`p0-common-gaps.test.ts` 中的 P0-08、P0-14 同属 reconnect 场景,也必须跳过:
|
|
829
|
+
|
|
830
|
+
```powershell
|
|
831
|
+
$tests = docker exec kite-ts-tester sh -lc "find /workspace/ts/tests/integration -maxdepth 1 -name '*.test.ts' -printf '%f\n' | sort" |
|
|
832
|
+
Where-Object { $_ -notmatch '^federation' -and $_ -ne 'reconnect.test.ts' }
|
|
833
|
+
foreach ($test in $tests) {
|
|
834
|
+
if ($test -eq 'p0-common-gaps.test.ts') {
|
|
835
|
+
docker exec -w /workspace/ts kite-ts-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded node_modules/vitest/vitest.mjs run "tests/integration/$test" --testNamePattern='^(?!.*(?:P0-08|P0-14)).*$'
|
|
836
|
+
} else {
|
|
837
|
+
docker exec -w /workspace/ts kite-ts-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded node_modules/vitest/vitest.mjs run "tests/integration/$test"
|
|
838
|
+
}
|
|
839
|
+
if ($LASTEXITCODE -ne 0) { throw "TS integration 失败: $test" }
|
|
840
|
+
}
|
|
841
|
+
```
|
|
842
|
+
|
|
843
|
+
完整 E2E 同样逐文件串行运行:
|
|
844
|
+
|
|
845
|
+
```powershell
|
|
846
|
+
$tests = docker exec kite-ts-tester sh -lc "find /workspace/ts/tests/e2e -maxdepth 1 -name '*.test.ts' -printf '%f\n' | sort"
|
|
847
|
+
foreach ($test in $tests) {
|
|
848
|
+
docker exec -w /workspace/ts kite-ts-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded node_modules/vitest/vitest.mjs run "tests/e2e/$test"
|
|
849
|
+
if ($LASTEXITCODE -ne 0) { throw "TS E2E 失败: $test" }
|
|
850
|
+
}
|
|
851
|
+
```
|
|
852
|
+
|
|
853
|
+
上述广义回归口径仍不包含 Mail、reconnect 和 federation。Mail 不应被静默当作“未实现”,应按本指南的 Mail 专用脚本单独运行;单文件定位问题时仍可直接把循环中的路径替换为目标文件。验收结论必须来自完整串行回归。
|
|
854
|
+
|
|
855
|
+
Gap 补洞测试(P2P + 群消息):
|
|
856
|
+
|
|
857
|
+
```powershell
|
|
858
|
+
docker exec -w /workspace/ts kite-ts-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded node_modules/vitest/vitest.mjs run tests/integration/message-gap.test.ts tests/integration/group-gap.test.ts
|
|
859
|
+
```
|
|
860
|
+
|
|
861
|
+
gap 测试每次运行使用随机动态 AID + 临时目录,不依赖固定身份,也不需要 `AUN_TEST_AUN_PATH`。
|
|
862
|
+
|
|
863
|
+
默认单实例 reconnect 集成测试当前由宿主机 Node 进程直接协调 `docker compose restart kite`,不适合放进临时 Docker 测试容器。宿主机必须已有完整 `node_modules`,缺失时停止,不在测试阶段执行安装:
|
|
864
|
+
|
|
865
|
+
```powershell
|
|
866
|
+
cd D:\modelunion\kite\aun-sdk-core\ts
|
|
867
|
+
if (-not (Test-Path node_modules/.bin/vitest.cmd)) { throw 'TS 宿主机依赖未准备,停止测试' }
|
|
868
|
+
& .\node_modules\.bin\vitest.cmd run tests/integration/reconnect.test.ts
|
|
869
|
+
```
|
|
870
|
+
|
|
871
|
+
运行这条 reconnect 用例前,要确保宿主机本身能解析 `agentid.pub`、`gateway.agentid.pub`,否则请先准备等效域名解析方案。
|
|
872
|
+
|
|
873
|
+
### JavaScript 集成 / 浏览器 E2E
|
|
874
|
+
|
|
875
|
+
JS SDK 分两类测试:
|
|
876
|
+
|
|
877
|
+
- `tests/integration`:Vitest + JS DOM,用于浏览器 SDK 的集成结构回归。
|
|
878
|
+
- `tests/e2e-browser`:Playwright + 真实 Chrome,用于真实网络 E2E。浏览器版 JS SDK 的 E2E 统一使用这一类。
|
|
879
|
+
|
|
880
|
+
默认单实例优先在 `kite-js-tester` 中执行。该容器使用独立 Linux `node_modules` volume;业务测试前必须已经完成 Google Chrome 和依赖准备。Compose 必须设置 `AUN_TEST_DISABLE_LOCAL_DOCKER_PIN=1`,让 Vitest 和 Chrome 使用 Docker DNS;否则测试辅助代码会把 `*.agentid.pub` 错误固定到 Tester 自己的 `127.0.0.1`。JS 的 Node 主进程和 Vitest worker 使用与 TS 相同的四个 V8 参数,但这些参数不能避免当前 WSL2 的原生崩溃。遇到 139/SIGSEGV 时,按本节后面的宿主机完整串行命令从失败文件继续。完整 integration 必须逐文件串行运行,并排除 federation、reconnect、Mail,以及同样需要重启 Gateway 的 `background-tasks.test.ts`:
|
|
881
|
+
|
|
882
|
+
```powershell
|
|
883
|
+
$tests = docker exec kite-js-tester sh -lc "find /workspace/js/tests/integration -maxdepth 1 -name '*.test.ts' -printf '%f\n' | sort" |
|
|
884
|
+
Where-Object { $_ -notmatch '^federation' -and $_ -notmatch 'mail' -and $_ -notin @('reconnect.test.ts', 'background-tasks.test.ts') }
|
|
885
|
+
foreach ($test in $tests) {
|
|
886
|
+
docker exec -w /workspace/js kite-js-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded node_modules/vitest/vitest.mjs run --environment jsdom "tests/integration/$test"
|
|
887
|
+
if ($LASTEXITCODE -ne 0) { throw "JS integration 失败: $test" }
|
|
888
|
+
}
|
|
889
|
+
```
|
|
890
|
+
|
|
891
|
+
`extra-info.test.ts`、`gateway-quota.test.ts`、`long-short-e2e.test.ts`、
|
|
892
|
+
`long-short.test.ts`、`slot-id-separator.test.ts` 和 `token-gateway-reuse.test.ts`
|
|
893
|
+
带有“目标域名必须解析到本机网卡”的生产环境保护。普通 Tester bridge 中,
|
|
894
|
+
`gateway.agentid.pub` 解析到 `kite-app` 的地址而不是 Tester 自身地址,因此这些用例会打印
|
|
895
|
+
`SKIP`,不能计为通过。使用临时 Node 容器共享 `kite-app` 的网络命名空间后定向补跑;
|
|
896
|
+
源码、Linux `node_modules` 和固定测试数据都从现有 Tester 只读/复用,不新建依赖环境:
|
|
897
|
+
|
|
898
|
+
```powershell
|
|
899
|
+
$localOnly = @(
|
|
900
|
+
'extra-info.test.ts', 'gateway-quota.test.ts', 'long-short-e2e.test.ts',
|
|
901
|
+
'long-short.test.ts', 'slot-id-separator.test.ts', 'token-gateway-reuse.test.ts'
|
|
902
|
+
)
|
|
903
|
+
foreach ($test in $localOnly) {
|
|
904
|
+
docker run --rm --network container:kite-app --volumes-from kite-js-tester `
|
|
905
|
+
-e AUN_ENV=development -e AUN_TEST_DISABLE_LOCAL_DOCKER_PIN=1 `
|
|
906
|
+
-e NODE_TLS_REJECT_UNAUTHORIZED=0 -e AUN_DATA_ROOT=/data/aun `
|
|
907
|
+
-e AUN_TEST_AUN_PATH=/data/aun/single-domain/persistent `
|
|
908
|
+
-e AUN_CONTRACTS_ROOT=/contracts `
|
|
909
|
+
-e HTTP_PROXY= -e HTTPS_PROXY= -e ALL_PROXY= -e NO_PROXY=* `
|
|
910
|
+
-w /workspace/js node:22-bookworm `
|
|
911
|
+
node --no-sparkplug --no-maglev --no-turbofan --single-threaded `
|
|
912
|
+
node_modules/vitest/vitest.mjs run --environment jsdom "tests/integration/$test"
|
|
913
|
+
if ($LASTEXITCODE -ne 0) { throw "JS 本机保护用例失败: $test" }
|
|
914
|
+
}
|
|
915
|
+
```
|
|
916
|
+
|
|
917
|
+
运行结果必须有实际用例计数和 `passed`,只有 `SKIP` 日志不构成业务验收。该临时容器
|
|
918
|
+
随命令退出,不需要修改服务端或 Tester 的网络连接。
|
|
919
|
+
|
|
920
|
+
浏览器 E2E 前先用同一组参数构建一次 SDK。容器内运行 Playwright 时必须设置 `AUN_TEST_DISABLE_LOCAL_DOCKER_PIN=1`,让 Chrome 使用 Docker DNS 解析 `*.agentid.pub`。完整 E2E 逐文件串行执行,并排除 federation、reconnect、Mail。注意 `notify.spec.ts` 同时包含单域和跨域 case,不能只按文件名过滤;所有文件都要通过 `--grep-invert` 排除标题中的“跨域/Federation”。`p0-common-gaps.spec.ts` 还要跳过 P0-08/P0-14:
|
|
921
|
+
|
|
922
|
+
```powershell
|
|
923
|
+
docker exec -w /workspace/js kite-js-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded -e "require('node:fs').rmSync('dist',{recursive:true,force:true})"
|
|
924
|
+
docker exec -w /workspace/js kite-js-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded node_modules/typescript/bin/tsc --pretty false
|
|
925
|
+
docker exec -w /workspace/js kite-js-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded scripts/fix-esm-imports.mjs
|
|
926
|
+
docker exec -w /workspace/js kite-js-tester node_modules/.bin/esbuild src/index.ts --bundle --format=esm --outfile=dist/bundle.js --platform=browser --target=es2020
|
|
927
|
+
|
|
928
|
+
$tests = docker exec kite-js-tester sh -lc "find /workspace/js/tests/e2e-browser -maxdepth 1 -name '*.spec.ts' -printf '%f\n' | sort" |
|
|
929
|
+
Where-Object { $_ -notmatch '^federation' -and $_ -notmatch 'reconnect|mail' }
|
|
930
|
+
foreach ($test in $tests) {
|
|
931
|
+
if ($test -eq 'p0-common-gaps.spec.ts') {
|
|
932
|
+
docker exec -e AUN_TEST_DISABLE_LOCAL_DOCKER_PIN=1 -w /workspace/js kite-js-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded node_modules/@playwright/test/cli.js test --config=playwright.agentid-local.config.ts "tests/e2e-browser/$test" --grep-invert '跨域|Federation|P0-08|P0-14' --reporter=line
|
|
933
|
+
} else {
|
|
934
|
+
docker exec -e AUN_TEST_DISABLE_LOCAL_DOCKER_PIN=1 -w /workspace/js kite-js-tester node --no-sparkplug --no-maglev --no-turbofan --single-threaded node_modules/@playwright/test/cli.js test --config=playwright.agentid-local.config.ts "tests/e2e-browser/$test" --grep-invert '跨域|Federation' --reporter=line
|
|
935
|
+
}
|
|
936
|
+
if ($LASTEXITCODE -ne 0) { throw "JS E2E 失败: $test" }
|
|
937
|
+
}
|
|
938
|
+
```
|
|
939
|
+
|
|
940
|
+
宿主机 Node 是当前 WSL2 原生崩溃时的已验证备选。宿主机模式不要设置 `AUN_TEST_DISABLE_LOCAL_DOCKER_PIN`,测试辅助代码和 `playwright.agentid-local.config.ts` 会将本地域名映射到已发布的容器端口。宿主机依赖缺失时停止,不在测试阶段安装。Integration 从首个失败文件开始逐文件执行:
|
|
941
|
+
|
|
942
|
+
```powershell
|
|
943
|
+
cd D:\modelunion\kite\aun-sdk-core\js
|
|
944
|
+
if (-not (Test-Path node_modules/.bin/vitest.cmd)) { throw 'JS 宿主机依赖未准备,停止测试' }
|
|
945
|
+
$env:NODE_TLS_REJECT_UNAUTHORIZED = '0'
|
|
946
|
+
$env:HTTP_PROXY = ''; $env:HTTPS_PROXY = ''; $env:ALL_PROXY = ''; $env:NO_PROXY = '*'
|
|
947
|
+
Remove-Item Env:AUN_TEST_DISABLE_LOCAL_DOCKER_PIN -ErrorAction SilentlyContinue
|
|
948
|
+
& .\node_modules\.bin\vitest.cmd run --environment jsdom --no-file-parallelism --maxWorkers=1 "tests/integration/<首个失败文件>"
|
|
949
|
+
```
|
|
950
|
+
|
|
951
|
+
浏览器 E2E 先执行 `npm run build`,再从首个未通过文件逐个运行;下面的 `--grep-invert` 同时排除混在 `notify.spec.ts` 内的跨域 case:
|
|
952
|
+
|
|
953
|
+
```powershell
|
|
954
|
+
if (-not (Test-Path node_modules/@playwright/test/cli.js)) { throw 'JS 宿主机依赖未准备,停止测试' }
|
|
955
|
+
$tests = Get-ChildItem tests/e2e-browser -Filter '*.spec.ts' | Sort-Object Name |
|
|
956
|
+
Where-Object { $_.Name -notmatch '^federation' -and $_.Name -notmatch 'reconnect|mail' }
|
|
957
|
+
foreach ($test in $tests) {
|
|
958
|
+
$exclude = if ($test.Name -eq 'p0-common-gaps.spec.ts') { '跨域|Federation|P0-08|P0-14' } else { '跨域|Federation' }
|
|
959
|
+
node node_modules/@playwright/test/cli.js test --config=playwright.agentid-local.config.ts "tests/e2e-browser/$($test.Name)" --grep-invert $exclude --reporter=line
|
|
960
|
+
if ($LASTEXITCODE -ne 0) { throw "JS E2E 失败: $($test.Name)" }
|
|
961
|
+
}
|
|
962
|
+
```
|
|
963
|
+
|
|
964
|
+
`playwright.agentid-local.config.ts` 在宿主机模式下:
|
|
965
|
+
|
|
966
|
+
- 禁用 Chrome 继承系统代理,避免 `*.agentid.pub` 被代理到外网
|
|
967
|
+
- 将 `*.agentid.pub` / `agentid.pub` 映射到 `127.0.0.1`
|
|
968
|
+
- 忽略本地 Docker 测试证书错误
|
|
969
|
+
|
|
970
|
+
校验 Inline 实时消息内部游标时,`message.received` / `group.message_created` 回调触发不代表 A/T/H 已完成原子提交。SDK 为避免“游标先推进、应用发布失败后消息丢失”,会先发布事件再提交游标;测试应有界轮询 SeqTracker 到消息 `seq`,不能在事件 Promise 刚完成时立即读取,也不要用固定时长 `sleep` 代替条件等待。应用层随后发起的 Pull 仍由当前 AUNClient 的客户端级 Pull Gate 串行化,不会因此重复返回该消息。
|
|
971
|
+
|
|
972
|
+
如果没有使用这个本地配置,网络 E2E 常见失败是:
|
|
973
|
+
|
|
974
|
+
```text
|
|
975
|
+
gateway discovery failed for https://gateway.agentid.pub/.well-known/aun-gateway: TypeError: Failed to fetch
|
|
976
|
+
```
|
|
977
|
+
|
|
978
|
+
如果 discovery 已通过,但登录失败:
|
|
979
|
+
|
|
980
|
+
```text
|
|
981
|
+
AuthError: aid_login2_failed
|
|
982
|
+
```
|
|
983
|
+
|
|
984
|
+
并且服务端日志中出现:
|
|
985
|
+
|
|
986
|
+
```text
|
|
987
|
+
AID phase2 signature verification failed: sign_time ... before cert validity ...
|
|
988
|
+
```
|
|
989
|
+
|
|
990
|
+
说明运行 Chrome 的 Tester 或宿主机时间与服务端容器签发证书使用的 UTC 时间存在偏差。两者偏差过大时,刚创建的 AID 证书会被服务端判定为“签名时间早于证书生效时间”。先对齐 Docker/宿主机时间,再重跑浏览器 E2E。
|
|
991
|
+
|
|
992
|
+
### Go 集成 / E2E
|
|
993
|
+
|
|
994
|
+
默认单实例 Go 测试优先使用常驻 `kite-go-tester` 容器接入 `kite-single_kite-net`。
|
|
995
|
+
|
|
996
|
+
常驻容器命令:
|
|
997
|
+
|
|
998
|
+
```powershell
|
|
999
|
+
docker exec kite-go-tester sh -lc "mkdir -p /workspace/go/.codex_gocache_linux /workspace/go/.codex_gotmp_linux && cd /workspace/go && /usr/local/go/bin/go test -tags integration . -run Integration -count=1 -v"
|
|
1000
|
+
docker exec kite-go-tester sh -lc "mkdir -p /workspace/go/.codex_gocache_linux /workspace/go/.codex_gotmp_linux && cd /workspace/go && /usr/local/go/bin/go test -tags integration . -run GroupE2E -count=1 -v"
|
|
1001
|
+
```
|
|
1002
|
+
|
|
1003
|
+
如果需要用临时容器跑同一组用例,下面命令默认复用宿主机 `C:\go\pkg\mod` 作为只读模块缓存。Windows Git Bash 下运行时统一在命令前加 `MSYS_NO_PATHCONV=1`。
|
|
1004
|
+
|
|
1005
|
+
集成测试:
|
|
1006
|
+
|
|
1007
|
+
```powershell
|
|
1008
|
+
docker run --rm --network kite-single_kite-net `
|
|
1009
|
+
-v D:\modelunion\kite\aun-sdk-core\go:/workspace/go `
|
|
1010
|
+
-v C:\go\pkg\mod:/go/pkg/mod:ro `
|
|
1011
|
+
-e HTTP_PROXY= -e HTTPS_PROXY= -e ALL_PROXY= -e NO_PROXY=* `
|
|
1012
|
+
-e GOMODCACHE=/go/pkg/mod `
|
|
1013
|
+
-e GOCACHE=/workspace/go/.codex_gocache_linux `
|
|
1014
|
+
-e GOTMPDIR=/workspace/go/.codex_gotmp_linux `
|
|
1015
|
+
golang:1.24-bookworm sh -lc "mkdir -p /workspace/go/.codex_gocache_linux /workspace/go/.codex_gotmp_linux && cd /workspace/go && /usr/local/go/bin/go test -tags integration . -run Integration -count=1 -v"
|
|
1016
|
+
```
|
|
1017
|
+
|
|
1018
|
+
E2E 测试:
|
|
1019
|
+
|
|
1020
|
+
```powershell
|
|
1021
|
+
docker run --rm --network kite-single_kite-net `
|
|
1022
|
+
-v D:\modelunion\kite\aun-sdk-core\go:/workspace/go `
|
|
1023
|
+
-v C:\go\pkg\mod:/go/pkg/mod:ro `
|
|
1024
|
+
-e HTTP_PROXY= -e HTTPS_PROXY= -e ALL_PROXY= -e NO_PROXY=* `
|
|
1025
|
+
-e GOMODCACHE=/go/pkg/mod `
|
|
1026
|
+
-e GOCACHE=/workspace/go/.codex_gocache_linux `
|
|
1027
|
+
-e GOTMPDIR=/workspace/go/.codex_gotmp_linux `
|
|
1028
|
+
golang:1.24-bookworm sh -lc "mkdir -p /workspace/go/.codex_gocache_linux /workspace/go/.codex_gotmp_linux && cd /workspace/go && /usr/local/go/bin/go test -tags integration . -run GroupE2E -count=1 -v"
|
|
1029
|
+
```
|
|
1030
|
+
|
|
1031
|
+
Go 当前还没有默认单实例 Docker reconnect 用例;默认单实例侧目前覆盖的是 `integration_test.go` 和 `e2e_group_test.go`。
|
|
1032
|
+
|
|
1033
|
+
## 分布式与双域环境
|
|
1034
|
+
|
|
1035
|
+
三节点 `dist-agentid.pub`、本地真实域名双域 `agentid.pub/agentid.cn`、隔离 federation `dist-aid.com/dist-aid.net`、分布式 Tester 和分布式 cross-SDK 的唯一运行说明见 [AUN 分布式测试运行指南](aun分布式测试运行指南.md)。
|
|
1036
|
+
|
|
1037
|
+
主指南不再复制 federation 命令。不得继续使用旧的 `aid.com/aid.net`、`client-a/client-b`、`federation-kite-*` 或 `federation-test_federation-net`;当前权威名称均以分布式 Compose 的 `dist-*` 配置为准。
|
|
1038
|
+
|
|
1039
|
+
## 何时需要 rebuild / recreate / restart
|
|
1040
|
+
|
|
1041
|
+
默认 Go 服务不是独立 Docker 容器,而是 `kite-app` 内由 Launcher 管理的子进程。Go binary 在 `docker compose build kite` 时编译并复制进 `docker-deploy-kite:latest`;`docker compose restart kite` 只会重启原容器,不会编译源码、切换镜像或应用新的 Compose 配置。
|
|
1042
|
+
|
|
1043
|
+
### 判断表
|
|
1044
|
+
|
|
1045
|
+
| 变更或状态 | 需要执行 | 说明 |
|
|
1046
|
+
| --- | --- | --- |
|
|
1047
|
+
| Go 服务源码、`go.mod` / `go.sum`、`module.md`、数据库迁移代码 | rebuild `kite` 镜像,再 recreate `kite-app` | binary 和 manifest 都在镜像内 |
|
|
1048
|
+
| Launcher、Kernel、Python 服务端代码、`Dockerfile`、服务端依赖 | rebuild + recreate | 同样由 Dockerfile 复制进镜像 |
|
|
1049
|
+
| 镜像已经 rebuild,但运行容器仍引用旧 image ID | 只需 recreate | 不需要重复 build |
|
|
1050
|
+
| 只改 `docker-compose.yml` 的环境变量、端口、volume 或 command | recreate,不需要 rebuild | `restart` 不会应用容器配置变化 |
|
|
1051
|
+
| 只改注册/配置中心动态配置或 desired-state | 通常不需要 Docker 操作 | Launcher watch 负责收敛目标状态 |
|
|
1052
|
+
| binary 未变,只需重启一个 Go 服务 | 在控制中心将目标状态设为 `stopped`,再切回 `running` | 只重启 Launcher 子进程,不影响整个节点 |
|
|
1053
|
+
| Launcher、Kernel、AUN Console 或整个容器异常,代码和配置均未变化 | restart `kite` | 继续使用同一镜像和容器配置 |
|
|
1054
|
+
| 只改 SDK 源码或测试脚本 | 服务端无需 rebuild/restart | Tester 直接 bind mount SDK 与测试目录 |
|
|
1055
|
+
| 准备运行 `pack.bat` 发布 | rebuild → recreate → 回归 → pack | `pack.bat` 只保存现有镜像,不负责 build |
|
|
1056
|
+
|
|
1057
|
+
服务进入 `stopped` 后不应继续注册;重新切到 `running` 后,必须等服务实际发送 `module.ready`,再确认注册状态恢复为活动。若修改的配置不支持热加载,也按这个 `stopped` → `running` 流程重启具体服务。
|
|
1058
|
+
|
|
1059
|
+
### 判断运行容器是否使用当前镜像
|
|
1060
|
+
|
|
1061
|
+
```powershell
|
|
1062
|
+
$runningImage = docker inspect kite-app --format '{{.Image}}'
|
|
1063
|
+
$latestImage = docker image inspect docker-deploy-kite:latest --format '{{.Id}}'
|
|
1064
|
+
$runningImage
|
|
1065
|
+
$latestImage
|
|
1066
|
+
$runningImage -eq $latestImage
|
|
1067
|
+
```
|
|
1068
|
+
|
|
1069
|
+
结果为 `False` 表示必须 recreate。结果为 `True` 只证明容器使用当前 tag 对应的镜像,不能证明工作区最新源码已经 build;当前镜像没有记录 dirty worktree 的内容摘要,因此只要改过服务端源码,最可靠的做法仍是重新 build。
|
|
1070
|
+
|
|
1071
|
+
### 服务端代码变更
|
|
1072
|
+
|
|
1073
|
+
以下内容变更都属于服务端镜像变更:
|
|
1074
|
+
|
|
1075
|
+
- `extensions/services/{auth,ca,gateway,group,leaderboard,message,nameservice,service_proxy,storage,stream}/go/`
|
|
1076
|
+
- 上述服务的 `module.md`、`module.go.md`、`module.py.md` 或 Python 回滚实现
|
|
1077
|
+
- `launcher/`、`kernel/`、其他 `extensions/services/` 代码
|
|
1078
|
+
- `Dockerfile`、服务端依赖或数据库迁移实现
|
|
1079
|
+
|
|
1080
|
+
默认单实例标准更新命令:
|
|
1081
|
+
|
|
1082
|
+
```powershell
|
|
1083
|
+
cd D:\modelunion\kite\docker-deploy
|
|
1084
|
+
docker compose --env-file NUL -f docker-compose.build.yml build kite
|
|
1085
|
+
docker compose --env-file agentid.pub/local.env --project-directory . -f docker-compose.yml -f agentid.pub/docker-compose.yml up -d --force-recreate --no-deps kite
|
|
1086
|
+
docker logs --tail 200 kite-app
|
|
1087
|
+
```
|
|
1088
|
+
|
|
1089
|
+
第二条命令已经完成容器替换,不需要再执行 `docker compose restart kite`。Go 服务的自动迁移在新服务进程启动时执行;只 restart 未重新 build 的旧容器,执行的仍是旧迁移代码。
|
|
1090
|
+
|
|
1091
|
+
如果代码和容器配置都没有变化,只是 Launcher、Kernel 或整个容器运行异常,才使用:
|
|
1092
|
+
|
|
1093
|
+
```powershell
|
|
1094
|
+
cd D:\modelunion\kite\docker-deploy
|
|
1095
|
+
docker compose --env-file agentid.pub/local.env --project-directory . -f docker-compose.yml -f agentid.pub/docker-compose.yml restart kite
|
|
1096
|
+
```
|
|
1097
|
+
|
|
1098
|
+
分布式或双域服务端镜像变更后的重建命令见分布式指南,不能套用默认单实例的容器名和网络。
|
|
1099
|
+
|
|
1100
|
+
### SDK 或测试代码变更
|
|
1101
|
+
|
|
1102
|
+
通常不需要操作服务端,因为 Tester 挂载 SDK 源码与测试目录。Go SDK 测试会在执行 `go test` 时重新编译;Python 测试直接读取挂载源码;TypeScript/JavaScript 直接读取各自 workspace。
|
|
1103
|
+
|
|
1104
|
+
只有 Tester 自身发生这些变化时才处理 Tester:Python 测试镜像依赖变化需要在独立准备阶段 rebuild `sdk-tester`;TypeScript/JavaScript 的 `package.json` 或 lockfile 变化必须先在独立准备阶段更新 Linux 依赖 volume,再重新创建对应 Tester。回到业务测试阶段后只允许复用已验证的容器和依赖,不得让 entrypoint 临时安装。
|
|
1105
|
+
|
|
1106
|
+
## 两个公网域的线上单节点部署材料
|
|
1107
|
+
|
|
1108
|
+
线上形态沿用本地验收过的单节点分布式控制模型:一个 `control_master`、一个 Launcher、MySQL、Redis,以及由 Launcher/ AUN Console 管理的服务实例。`agentid.pub` 与 `agentid.cn` 必须使用独立数据根、Compose project、容器名和控制令牌。本地双域 Docker 是跨域发布前门禁,不等于线上部署。
|
|
1109
|
+
|
|
1110
|
+
### 日常交付契约(严格 3 个文件)
|
|
1111
|
+
|
|
1112
|
+
`agentid.pub/online/go/` 是当前线上 Go 服务端日常替换包,严格只有:
|
|
1113
|
+
|
|
1114
|
+
- `kite-docker.tar.gz`:带 manifest 和 SHA-256 的 Kite 服务镜像包;
|
|
1115
|
+
- `docker-compose.yml`:独立可执行的单文件生产 Compose,不依赖第二份 YAML;
|
|
1116
|
+
- `unpack.sh`:只校验并 `docker load` 镜像,绝不启动或停止 Compose。
|
|
1117
|
+
|
|
1118
|
+
`init.sql` 和其他稳定辅助材料不进入日常包。当前一次性辅助归档为 `agentid.pub/online/bootstrap-materials.tar.gz`(解包源目录是 `agentid.pub/online/bootstrap/`),其中的 `init.sql` 首次部署时解到日常包同一目录并长期保留;日常升级不得删除它。CA、AID、TLS、MySQL 数据和 workspace 也不进入任何镜像/代码包,必须由目标服务器已有或通过独立受控迁移提供。
|
|
1119
|
+
|
|
1120
|
+
Push 已纳入 AUN Console 管理,生产 Compose 默认将 Push 目标状态保持为 stopped(当前 plaintext token 模式不允许在 production 启动)。即使 `aun_push` 尚不存在,Push 启动链也会在收到 MySQL 1049(未知数据库)时创建固定数据库并继续版本迁移;其他连接/认证错误直接失败。
|
|
1121
|
+
|
|
1122
|
+
### 构建与生成日常包
|
|
1123
|
+
|
|
1124
|
+
先在当前 `D:\modelunion\kite` worktree 构建并回归服务镜像;`pack.bat`(Windows)或 `pack.sh`(Linux)只保存现有 `docker-deploy-kite:latest`,不会替你 build:
|
|
1125
|
+
|
|
1126
|
+
```powershell
|
|
1127
|
+
cd D:\modelunion\kite\docker-deploy
|
|
1128
|
+
docker compose --env-file NUL -f docker-compose.build.yml build kite
|
|
1129
|
+
.\pack.bat
|
|
1130
|
+
```
|
|
1131
|
+
|
|
1132
|
+
打包器会把当前镜像保存为 `kite-docker.tar.gz`,在包内写入镜像 ID、创建时间和归档 SHA-256。把生成的 `kite-docker.tar.gz`、`agentid.pub\online\go\docker-compose.yml`、`agentid.pub\online\go\unpack.sh` 放入同一交付目录;三者必须来自同一源码/镜像构建批次,不能混用旧归档。
|
|
1133
|
+
|
|
1134
|
+
### 首次安装与日常替换
|
|
1135
|
+
|
|
1136
|
+
目标 Linux 主机先准备域专属材料(至少 CA、TLS、10 个服务 AID 和既有 MySQL 数据)。Compose 已内置可直接运行的默认值:数据根为当前目录的 `./data`,MySQL root 密码为 `root`,控制令牌为 `aun-local-control-token`,服务面令牌为 `aun-local-service-plane-token`;Issuer 固定为 `agentid.pub`。因此不创建 `.env`、不执行任何 `export`,`down` 和 `up` 也都能正常解析。
|
|
1137
|
+
|
|
1138
|
+
首次部署时,把 `bootstrap-materials.tar.gz` 解到三文件目录得到 `init.sql` 并长期保留,同时把 CA、TLS、AID 和既有运行数据放到 `./data/CA`、`./data/certs`、`./data/AIDs`、`./data/mysql`、`./data/redis` 与 `./data/kite-workspace`。然后执行:
|
|
1139
|
+
|
|
1140
|
+
```bash
|
|
1141
|
+
tar -xzf bootstrap-materials.tar.gz
|
|
1142
|
+
docker compose down
|
|
1143
|
+
chmod +x unpack.sh
|
|
1144
|
+
./unpack.sh
|
|
1145
|
+
docker compose up -d
|
|
1146
|
+
docker compose ps
|
|
1147
|
+
```
|
|
1148
|
+
|
|
1149
|
+
这就是日常升级的完整顺序:先停旧容器,再由 `unpack.sh` 校验并替换镜像,最后由同一份 `docker-compose.yml` 启动。`unpack.sh` 不执行 `docker compose up/down`,不删除卷,不修改数据库、证书或身份材料;MySQL/Redis 镜像由 `docker compose up -d` 按需拉取。首次空库启动时 `init.sql` 由 MySQL entrypoint 执行;既有库或后加库由对应服务的幂等启动迁移处理。
|
|
1150
|
+
|
|
1151
|
+
如需使用其他数据目录或生产独立密钥,可在服务器创建一份不随日常包替换的 `.env` 进行可选覆盖;它不是 Compose 的运行前提:
|
|
1152
|
+
|
|
1153
|
+
```dotenv
|
|
1154
|
+
AUN_SERVER_DATA_ROOT=/srv/aun/agentid.pub
|
|
1155
|
+
MYSQL_ROOT_PASSWORD=替换为既有数据库密码
|
|
1156
|
+
AUN_CONTROL_INTERNAL_TOKEN=替换为独立随机控制令牌
|
|
1157
|
+
AUN_SERVICE_PLANE_TOKEN=替换为独立随机服务面令牌
|
|
1158
|
+
```
|
|
1159
|
+
|
|
1160
|
+
同一数据根首次启动后不得随意更改 MySQL 密码;同一集群各进程使用的控制令牌和服务面令牌必须保持一致。公网生产环境应覆盖内置默认密码与令牌,但无论是否覆盖,日常部署命令都保持不变。
|
|
1161
|
+
|
|
1162
|
+
`agentid.cn` 必须使用另一份单文件 Compose、另一数据根和另一组令牌,不能把 `agentid.pub` 的三文件目录直接复用。没有完整域数据根时不得用空 MySQL 加现有证书直接启动,否则 `aun_cert` 中缺少激活记录会导致固定证书被判定为未激活。
|
|
1163
|
+
|
|
1164
|
+
## 故障排查
|
|
1165
|
+
|
|
1166
|
+
- 先看 Name Service 的 `/.well-known/aun-gateway` 是否能返回非 loopback 的 Gateway URL。
|
|
1167
|
+
- 再看测试容器内是否能解析 `gateway.{issuer}`、`stream.{issuer}`、`storage.{issuer}`、`group.{issuer}`。
|
|
1168
|
+
- 如果测试脚本拿到的是 `127.0.0.1` 或 `localhost`,优先视为服务端 URL 生成逻辑有 bug,而不是测试环境问题。
|
|
1169
|
+
- 如果固定 `alice.agentid.pub` 登录返回 `certificate_not_active`,先执行“默认单实例启动前强制核验”。本地证书有效但当前 `aun_cert.agentid_cert` 没有对应记录,通常说明 MySQL 数据目录或 Compose 来源选错;不得先清库、重建身份或重新签发证书。
|
|
1170
|
+
- 只有确认 Compose、MySQL 数据目录、Issuer 和固定身份目录完全配套后,才继续只读比对证书序列号、指纹和 lifecycle。任何补登记、导入、清理或重建都需要用户明确同意。
|
|
1171
|
+
- 如果改了服务端代码但测试结果没变化,通常是镜像没 rebuild 或容器没重启。
|
|
1172
|
+
- 本地 agentid.pub 服务容器是 `kite-app`,agentid.cn 是 `kite-agentid-cn-local-app`。`kite` 是 Compose service 名;restart/recreate 必须同时带对应域的 `local.env`、域覆盖和当前使用的 federation overlay。
|
|
1173
|
+
- message / group WAL 或批量写入相关改动后,先确认 WAL writer 已启动,再查错误日志:
|
|
1174
|
+
|
|
1175
|
+
```powershell
|
|
1176
|
+
docker logs --since 30m kite-app 2>&1 | Select-String -Pattern "WAL enabled|WAL writer started|后台批量写入协程已启动"
|
|
1177
|
+
docker logs --since 30m kite-app 2>&1 | Select-String -Pattern "WAL 批量写入失败|批量写入失败|Traceback|Exception|Deadlock|Lock wait|OperationalError"
|
|
1178
|
+
```
|
|
1179
|
+
|
|
1180
|
+
- 分布式或双域问题按分布式指南的环境预检检查,不复用默认单实例容器名。
|
|
1181
|
+
- TS 如果在 Linux 容器里直接使用宿主机 `node_modules`,优先怀疑原生模块 ABI 不匹配,而不是业务代码本身。
|
|
1182
|
+
- Go 如果在容器里跑测试时开始重新联网下载模块,优先检查 `C:\go\pkg\mod -> /go/pkg/mod` 的只读挂载和 `GOMODCACHE=/go/pkg/mod` 是否生效。
|
|
1183
|
+
- 默认服务端只看到 `mysql`、`redis`、`kite` 是正常基线;如果需要 agentid.pub Tester,单独检查 `docker compose --env-file agentid.pub/local.env --project-directory . -f docker-compose.testers.yml ps`。
|
|
1184
|
+
- `kite-js-tester` 内的 Vitest 或 Playwright 如果访问了 `127.0.0.1` 而不是 Docker 服务,确认 Compose 和 `docker exec` 命令都设置了 `AUN_TEST_DISABLE_LOCAL_DOCKER_PIN=1`。
|
|
1185
|
+
|
|
1186
|
+
### 常见踩坑
|
|
1187
|
+
|
|
1188
|
+
- **Python Tester 随机 `SIGSEGV` 或标准库对象损坏**:先运行“启动 SDK Tester”一节的 `pip check` 和 100 次导入探针,并记录镜像 ID、容器退出码和服务日志。该症状发生在 SDK/RPC 调用前,不能按服务端业务失败处理;确认镜像依赖和 Docker 运行态后,只 recreate Python Tester,固定身份和本地 SQLite 数据必须保留。SDK 0.5.6 不依赖 `sqlcipher3`;若 Tester 中仍安装该原生扩展,应重建镜像移除,而不是继续围绕它补系统依赖。
|
|
1189
|
+
- **`message.send does not accept delivery_mode`**:SDK 新版本要求 `delivery_mode` 在 `connect()` 时配置,不能在 `message.send` 参数中传入。测试脚本中的 `”delivery_mode”: {“mode”: “fanout”}` 应从 `message.send` 调用中移除,改到 `make_client()` 或 `connect()` 参数中。
|
|
1190
|
+
- **固定证书有效但登录报未激活**:这不是证书格式错误。先核对 MySQL 容器的 Compose project 和 `/var/lib/mysql` mount;agentid.pub 必须指向 `docker-deploy/data/mysql`,agentid.cn 必须指向 `docker-deploy/data-agentid-cn/mysql`。
|
|
1191
|
+
- **SDK `key.json` 身份私钥解密失败**:先核对 AID、身份目录,以及构造 `AIDStore` 或 SDK 客户端时传入的 `encryption_seed` / `seed_password` 是否与生成 `key.json` 时一致。不要在身份目录中查找或补建 seed 文件。Docker 服务的只读 PEM 身份不使用 seed,应核对证书、私钥、AID 主体和挂载路径。即使确认是临时 AID,删除或重建身份材料也必须先取得用户明确同意,固定身份材料不得改动。
|
|
1192
|
+
|
|
1193
|
+
## 当前边界
|
|
1194
|
+
|
|
1195
|
+
- `integration_test_reconnect.py` 仍是宿主机脚本,不适合放进测试容器。
|
|
1196
|
+
- `ts/tests/integration/reconnect.test.ts` 也是宿主机协调型测试,用于控制默认单实例 `docker compose restart kite`,不适合直接塞进临时测试容器。
|
|
1197
|
+
- Go 当前没有默认单实例 Docker reconnect 用例;分布式和双域 reconnect 覆盖见分布式指南。
|
|
1198
|
+
- 浏览器版 JS SDK 的真实浏览器 E2E 优先在 `kite-js-tester` 中运行,并设置 `AUN_TEST_DISABLE_LOCAL_DOCKER_PIN=1`;宿主机 Playwright 仍是支持的备选入口。
|
|
1199
|
+
- 其余默认单实例集成/E2E 应优先在同一 Docker 网络的 Tester 内运行,以保证与服务端网络环境一致。
|