@agentunion/fastaun-browser 0.5.6 → 0.5.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/_packed_docs/CHANGELOG.md +104 -0
  3. package/_packed_docs/INDEX.md +12 -11
  4. package/_packed_docs/KITE_DOCS_GUIDE.md +4 -3
  5. package/_packed_docs/agent.md/SCHEMA.md +83 -58
  6. package/_packed_docs/agent.md/examples/codeagent-claudecode.md +1 -1
  7. package/_packed_docs/agent.md/examples/openclaw-lobster.md +1 -1
  8. package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +1 -1
  9. package/_packed_docs/agent.md/examples//347/276/244/347/273/204-/345/274/200/345/217/221/345/233/242/351/230/237.md +21 -0
  10. 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 +3 -3
  11. 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 +7 -0
  12. 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 +422 -331
  13. package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +598 -398
  14. package/_packed_docs/group-message-rpc-alignment-gaps.md +741 -0
  15. package/_packed_docs/message-online-push-alignment.md +572 -0
  16. package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +1 -1
  17. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +10 -10
  18. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +2 -2
  19. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +30 -10
  20. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +23 -20
  21. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +3 -3
  22. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +5 -6
  23. package/_packed_docs/sdk/09-group-rpc-manual.md +11 -7
  24. package/_packed_docs/sdk/09-message-rpc-manual.md +5 -3
  25. package/_packed_docs/sdk/09-storage-rpc-manual.md +14 -3
  26. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +19 -17
  27. package/_packed_docs/sdk/CHANGELOG-0.5.6.md +73 -0
  28. package/_packed_docs/sdk/INDEX.md +22 -22
  29. package/_packed_docs/sdk/README.md +6 -5
  30. package/dist/agent-md-schema.d.ts +14 -0
  31. package/dist/agent-md-schema.d.ts.map +1 -0
  32. package/dist/agent-md-schema.js +103 -0
  33. package/dist/agent-md-schema.js.map +1 -0
  34. package/dist/agent-md.d.ts +7 -0
  35. package/dist/agent-md.d.ts.map +1 -1
  36. package/dist/agent-md.js +230 -10
  37. package/dist/agent-md.js.map +1 -1
  38. package/dist/aid-store.d.ts +5 -1
  39. package/dist/aid-store.d.ts.map +1 -1
  40. package/dist/aid-store.js +24 -4
  41. package/dist/aid-store.js.map +1 -1
  42. package/dist/aid.d.ts +2 -0
  43. package/dist/aid.d.ts.map +1 -1
  44. package/dist/aid.js +29 -7
  45. package/dist/aid.js.map +1 -1
  46. package/dist/auth.d.ts.map +1 -1
  47. package/dist/auth.js +1 -0
  48. package/dist/auth.js.map +1 -1
  49. package/dist/bundle.js +30253 -21955
  50. package/dist/cert-utils.d.ts +1 -0
  51. package/dist/cert-utils.d.ts.map +1 -1
  52. package/dist/cert-utils.js +36 -16
  53. package/dist/cert-utils.js.map +1 -1
  54. package/dist/client/delivery.d.ts +40 -5
  55. package/dist/client/delivery.d.ts.map +1 -1
  56. package/dist/client/delivery.js +719 -221
  57. package/dist/client/delivery.js.map +1 -1
  58. package/dist/client/group-state.js +2 -2
  59. package/dist/client/group-state.js.map +1 -1
  60. package/dist/client/lifecycle.d.ts +15 -1
  61. package/dist/client/lifecycle.d.ts.map +1 -1
  62. package/dist/client/lifecycle.js +463 -151
  63. package/dist/client/lifecycle.js.map +1 -1
  64. package/dist/client/rpc-pipeline.d.ts +25 -6
  65. package/dist/client/rpc-pipeline.d.ts.map +1 -1
  66. package/dist/client/rpc-pipeline.js +407 -123
  67. package/dist/client/rpc-pipeline.js.map +1 -1
  68. package/dist/client/runtime.d.ts +1 -3
  69. package/dist/client/runtime.d.ts.map +1 -1
  70. package/dist/client/runtime.js +4 -7
  71. package/dist/client/runtime.js.map +1 -1
  72. package/dist/client/v2-e2ee.d.ts +20 -2
  73. package/dist/client/v2-e2ee.d.ts.map +1 -1
  74. package/dist/client/v2-e2ee.js +434 -112
  75. package/dist/client/v2-e2ee.js.map +1 -1
  76. package/dist/client.d.ts +22 -10
  77. package/dist/client.d.ts.map +1 -1
  78. package/dist/client.js +500 -116
  79. package/dist/client.js.map +1 -1
  80. package/dist/facades.d.ts +23 -1
  81. package/dist/facades.d.ts.map +1 -1
  82. package/dist/facades.js +55 -7
  83. package/dist/facades.js.map +1 -1
  84. package/dist/group-id.d.ts.map +1 -1
  85. package/dist/group-id.js +2 -17
  86. package/dist/group-id.js.map +1 -1
  87. package/dist/index.d.ts +4 -3
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +2 -1
  90. package/dist/index.js.map +1 -1
  91. package/dist/seq-tracker.d.ts.map +1 -1
  92. package/dist/seq-tracker.js +8 -2
  93. package/dist/seq-tracker.js.map +1 -1
  94. package/dist/tools/cross-sdk-agent.js +23 -1
  95. package/dist/tools/cross-sdk-agent.js.map +1 -1
  96. package/dist/transport.d.ts.map +1 -1
  97. package/dist/transport.js +8 -1
  98. package/dist/transport.js.map +1 -1
  99. package/dist/validators.d.ts.map +1 -1
  100. package/dist/validators.js +8 -14
  101. package/dist/validators.js.map +1 -1
  102. package/dist/version.d.ts +1 -1
  103. package/dist/version.js +1 -1
  104. package/package.json +6 -5
@@ -1,26 +1,33 @@
1
- # AUN 分布式测试运行指南
2
-
1
+ # AUN 分布式测试运行指南
2
+
3
3
  本文档负责三套本地 Docker 环境:三节点单域、本地真实域名双域 `agentid.pub/agentid.cn`、隔离双域 federation `dist-aid.com/dist-aid.net`。默认 `agentid.pub` 单域、默认四语言 Tester 和默认 cross-SDK 统一见 [AUN 测试运行指南](aun测试运行指南.md)。公网 `agentid.pub/agentid.cn` 复测是本地跨域通过后的独立验证层,不属于本地双域 Docker。
4
4
 
5
5
  本指南只认当前 worktree `D:\modelunion\kite`。当前分支已经包含完整的默认单实例、三节点分布式、两套双域环境、服务端源码和四语言 SDK;服务端镜像、Tester、Cross-SDK、`data-dist` 与部署包都必须从这个 worktree 生成和运行。
6
6
 
7
7
  其他分支或相邻 worktree 各自维护自己的 Compose、数据和产物,当前分支不得引用。当前 worktree 固定使用 `kite-main-dist-*` 命名空间、`172.31.89.0/24` 网段和 38xxx/39xxx/40xxx/41xxx/42xxx 宿主端口;相邻 `aun-distributed` worktree 保留 `kite-dist-*`、`172.31.88.0/24` 和旧端口。两套环境可以同时存在,不得共享 project、容器名、网络、子网、端口、可变镜像 tag、Redis 卷或 bind mount。当前 worktree 的服务端/Tester 分支产物使用 `*-main-dist:*` tag;MySQL、Redis、PostgreSQL、Node、Go 等固定版本基础镜像可以共享。目录名、镜像 tag 和容器名不能单独证明来源;运行时以 Compose label、bind mount、镜像 ID 和源码哈希为最终证据。
8
-
9
- 节点角色、节点启动、服务启停、注册发现和配置恢复的系统性流程见
10
- [分布式 AUN 节点与服务启动流程](../../extensions/services/docs/分布式AUN节点与服务启动流程.md)。
11
-
12
- ## 适用范围
13
-
8
+
9
+ 节点角色、节点启动、服务启停、注册发现和配置恢复的系统性流程见
10
+ [分布式 AUN 节点与服务启动流程](../../extensions/services/docs/分布式AUN节点与服务启动流程.md)。
11
+
12
+ ## 测试指南:
13
+ D:\modelunion\kite\aun-sdk-core\docs\aun测试运行指南.md
14
+ D:\modelunion\kite\aun-sdk-core\docs\aun分布式测试运行指南.md
15
+ D:\modelunion\kite\aun-sdk-core\docs\aun公网测试运行指南.md
16
+
17
+ 运行测试(单元、集成、E2E, cross-sdk, 双域)时应该使用断点续跑的方法,即运行到某个测试时如果发生失败,应该立即停下来,修复此用例,然后再接着此用例运行后续用例。之前通过的用例如果手续修改不受影响则不要重复跑。
18
+
19
+ ## 适用范围
20
+
14
21
  - 当前 worktree:`D:\modelunion\kite`
15
22
  - 三节点单域集群:`D:\modelunion\kite\docker-deploy\docker-compose.distributed.yml`
16
23
  - 本地真实域名双域:两域基础 Compose + 域覆盖 + `D:\modelunion\kite\docker-deploy\docker-compose.agentid-federation.yml`
17
24
  - 隔离双域 federation:`D:\modelunion\kite\docker-deploy\federation-test\docker-compose.yml`
18
25
  - 分布式 Tester:`D:\modelunion\kite\docker-deploy\docker-compose.distributed-testers.yml`
19
26
  - 分布式 Cross-SDK:`D:\modelunion\kite\aun-sdk-core\tests\cross-sdk\docker-compose.cross-sdk.distributed.yml`
20
- - 本地 TLS 证书:只用于本地测试,SDK 侧统一 `AUN_ENV=development`、`AUN_VERIFY_SSL=0`
21
- - 本阶段仅跳过文件名包含 `reconnect` 或 `mail` 的测试;其余发现到的 Python SDK integration/E2E 文件均必须运行并通过。
22
- - 带 `if __name__ == "__main__"` 的脚本使用 `python <file>` 直接执行,纯 pytest 文件使用 `python -m pytest -q <file>`;每个文件分别记录日志、退出码和运行方式。pytest 退出码 `5` 表示未收集到测试,必须先核对 runner 选择与测试清单,不能直接归因于服务失败。
23
-
27
+ - 本地 TLS 证书:只用于本地测试,SDK 侧统一 `AUN_ENV=development`、`AUN_VERIFY_SSL=0`
28
+ - 本阶段仅跳过文件名包含 `reconnect` 或 `mail` 的测试;其余发现到的 Python SDK integration/E2E 文件均必须运行并通过。
29
+ - 带 `if __name__ == "__main__"` 的脚本使用 `python <file>` 直接执行,纯 pytest 文件使用 `python -m pytest -q <file>`;每个文件分别记录日志、退出码和运行方式。pytest 退出码 `5` 表示未收集到测试,必须先核对 runner 选择与测试清单,不能直接归因于服务失败。
30
+
24
31
  身份数据保护、禁止清库、禁止重建固定 AID、断网测试和 Go 1.24 规则继承主指南,在分布式环境中同样是硬约束。
25
32
 
26
33
  ### Git 与产物边界
@@ -36,7 +43,7 @@
36
43
 
37
44
  ## 本地真实域名双域与公网环境边界
38
45
 
39
- `agentid.pub` 与 `agentid.cn` 在本机各运行一套“分布式控制模型的单节点形态”,共同组成当前真实域名双域 Docker 跨域环境。两域复用同一服务镜像,但各自拥有独立 Issuer CA、10 个服务 AID、MySQL、Redis、workspace、Compose project 和宿主端口;只共享 `kite-agentid-federation-net` 上的 Kite 业务节点。
46
+ `agentid.pub` 与 `agentid.cn` 在本机各运行一套“分布式控制模型的单节点形态”,共同组成当前真实域名双域 Docker 跨域环境。两域复用同一服务镜像,但各自拥有独立 Issuer CA、10 个服务 AID、MySQL、Redis、workspace、Compose project 和宿主端口;只共享 `kite-agentid-federation-net` 上的 Kite 业务节点。服务镜像固定使用 `python:3.11-bookworm`,最终镜像不包含 `uvloop`,Compose 默认 `AUN_GATEWAY_USE_UVLOOP=0`。
40
47
 
41
48
  - `D:\modelunion\kite\docker-deploy\agentid.pub`:引用固定 `data`,project 为 `kite-single`,应用容器为 `kite-app`。
42
49
  - `D:\modelunion\kite\docker-deploy\agentid.cn`:引用固定 `data-agentid-cn`,project 为 `kite-agentid-cn-local`,应用容器为 `kite-agentid-cn-local-app`。
@@ -48,16 +55,16 @@
48
55
  这两个真实域不得使用 `prepare_dist_materials.py`、`federation-test/setup_certs.py` 或 `federation-test/tests/setup_aids.py`。这些脚本只用于获准创建 `dist-*` 隔离身份;拿它们补真实域材料会改变身份根。任何真实域固定身份、证书、数据库的新增、覆盖、删除或补登记都必须先取得明确授权。
49
56
 
50
57
  ## 环境命名
51
-
52
- | 环境 | 域名 | 数据目录 | Compose project | 主要容器 | 宿主机入口 |
53
- | --- | --- | --- | --- | --- | --- |
58
+
59
+ | 环境 | 域名 | 数据目录 | Compose project | 主要容器 | 宿主机入口 |
60
+ | --- | --- | --- | --- | --- | --- |
54
61
  | 三节点分布式 | `dist-agentid.pub` | `D:\modelunion\kite\docker-deploy\data-dist` | `kite-main-dist-worktree` | `kite-main-dist-aun-control`, `kite-main-dist-aun-node-a`, `kite-main-dist-aun-node-b` | `https://localhost:39876` |
55
62
  | 分布式 SDK Tester | `dist-agentid.pub` | `...\data-dist\sdk-testers` | `kite-main-dist-sdk-testers` | `main-dist-python-sdk-tester`, `main-dist-go-sdk-tester`, `main-dist-ts-sdk-tester`, `main-dist-js-sdk-tester` | Docker internal |
56
63
  | 分布式 cross-SDK | `dist-agentid.pub` | `...\aun-sdk-core\tests\cross-sdk\data-dist` | `kite-main-dist-cross-sdk` | `main-dist-cross-sdk-*` | Docker internal |
57
64
  | 本地真实域名双域 A | `agentid.pub` | `...\docker-deploy\data` | `kite-single` | `kite-app`, `kite-mysql`, `kite-redis` | Gateway `20001`、Console `19876` |
58
65
  | 本地真实域名双域 B | `agentid.cn` | `...\docker-deploy\data-agentid-cn` | `kite-agentid-cn-local` | `kite-agentid-cn-local-app`, `-mysql`, `-redis` | Gateway `42001`、Console `42876`、NameService `42443`、Storage `42470`、Group `42480`、MySQL `8406` |
59
66
  | 隔离双域 federation | `dist-aid.com`, `dist-aid.net` | `...\docker-deploy\federation-test\data-dist` | `kite-main-dist-federation` | `main-dist-federation-kite-a`, `main-dist-federation-kite-b`, `main-dist-client-a`, `main-dist-client-b` | `41876`, `42876` |
60
-
67
+
61
68
  `dist-*` 环境使用全新域名,默认不复制真实域数据库。其 CA、AID、TLS 材料只生成或复制到当前 worktree 的 `data-dist`,不要与 `docker-deploy/data`、`docker-deploy/data-agentid-cn` 或其他 worktree 共享运行时目录。
62
69
 
63
70
  ### 从其他 worktree 接管既有 `data-dist`
@@ -75,11 +82,11 @@
75
82
  整套冷克隆会继承来源环境的历史业务数据,适合当前分支接管并继续回归。只有明确需要全新隔离身份和空业务库时,才在用户授权后运行 `prepare_dist_materials.py` 并完成新证书注册验收;“新建空目录 + 复制旧证书”不是合法初始化方式。
76
83
 
77
84
  默认单实例和分布式环境必须长期保持两套独立测试窗口:
78
-
85
+
79
86
  - 默认单实例只使用 `D:\modelunion\kite\docker-deploy\docker-compose.yml`、域覆盖、`docker-deploy/data*`、`kite-*` 容器、默认端口和默认 Tester。
80
87
  - 分布式环境只使用当前 worktree 的 `docker-compose.distributed*.yml` / federation Compose、`dist-agentid.pub` / `dist-aid.*`、`data-dist`、`kite-main-dist-*` / `main-dist-*` 容器和独立端口。
81
88
  - 不要在分布式测试中 exec、restart、down 默认单实例的 `kite-app`、`kite-python-sdk-tester`、`kite-go-tester`、`kite-ts-tester`、`kite-js-tester` 等容器。
82
-
89
+
83
90
  `root.crt`、`ca.registry.aun.crt`、`ca.registry.aun.key` 以当前 worktree 的 `certool/certs` 为唯一来源。分布式环境不重新生成 root CA 或 registry CA;只在获得明确授权后为 `dist-*` 域生成 issuer CA、内置服务 AID 证书、分布式本地泛域 TLS 证书,并生成 worker 使用的本地 `aun-ca-bundle.crt`。
84
91
 
85
92
  ### 运行时来源强制核验
@@ -152,23 +159,23 @@ foreach ($container in $containers) {
152
159
  ```
153
160
 
154
161
  任何一个容器的 Compose label 或 bind mount 不在 `D:\modelunion\kite` 都属于混合环境,必须停止对应分布式 project 后从当前 worktree 整套重建;不得只替换单个容器,也不得加 `-v`。
155
-
156
- ## 三节点分布式集群
157
-
158
- ### Group-Go 三节点覆盖层
159
-
160
- 需要在三节点环境持续运行 Group-Go 并执行 SDK integration/E2E 时,使用专用覆盖层;它只在容器内把 Go候选 manifest 挂载为 `module.md`,宿主 `extensions/services/group/module.md` 仍保持 Python:
161
-
162
- ```powershell
162
+
163
+ ## 三节点分布式集群
164
+
165
+ ### Group-Go 三节点覆盖层
166
+
167
+ 需要在三节点环境持续运行 Group-Go 并执行 SDK integration/E2E 时,使用专用覆盖层;它只在容器内把 Go候选 manifest 挂载为 `module.md`,宿主 `extensions/services/group/module.md` 仍保持 Python:
168
+
169
+ ```powershell
163
170
  cd D:\modelunion\kite\docker-deploy
164
- docker compose --env-file .env.distributed `
165
- -f docker-compose.distributed.yml `
166
- -f docker-compose.distributed.group-go.yml `
167
- up -d --force-recreate aun-control aun-node-a aun-node-b
168
- ```
169
-
170
- 服务仍按控制中心 desired-state 调度。当前 CoreDNS 将 `group.dist-agentid.pub` 指向 `aun-node-a`,因此执行 SDK测试前应确认 registry 中唯一 active Group实例为 `aun-node-a:group`,且 `group.status` 返回 `implementation=go`。同一 DB/schema 不得同时运行 Python Group和Group-Go。
171
-
171
+ docker compose --env-file .env.distributed `
172
+ -f docker-compose.distributed.yml `
173
+ -f docker-compose.distributed.group-go.yml `
174
+ up -d --force-recreate aun-control aun-node-a aun-node-b
175
+ ```
176
+
177
+ 服务仍按控制中心 desired-state 调度。当前 CoreDNS 将 `group.dist-agentid.pub` 指向 `aun-node-a`,因此执行 SDK测试前应确认 registry 中唯一 active Group实例为 `aun-node-a:group`,且 `group.status` 返回 `implementation=go`。同一 DB/schema 不得同时运行 Python Group和Group-Go。
178
+
172
179
  ### 材料与镜像核验
173
180
 
174
181
  日常测试只复用既有 `.env.distributed`、`data-dist/CA`、`data-dist/AIDs`、`data-dist/certs` 和数据库,不重新生成材料:
@@ -210,34 +217,34 @@ if (Compare-Object $hostHashes $inside) { throw '分布式服务镜像不是当
210
217
  启动后还必须执行“运行时来源强制核验”。仅仅镜像哈希相同但 Compose label 或 `data-dist` mount 指向其他 worktree,仍然属于混合环境。
211
218
 
212
219
  `prepare_dist_materials.py` 只用于首次创建独立分布式环境,并且会写入 CA、服务 AID 和 TLS 材料。只有用户明确同意创建或重建身份材料后才能执行;日常测试不得使用 `--force`。`.env.distributed` 已存在时也不得用 example 覆盖。
213
-
214
- 关键默认值:
215
-
220
+
221
+ 关键默认值:
222
+
216
223
  - `AUN_IMAGE=docker-deploy-kite-main-dist:latest`
217
224
  - `AUN_SDK_TESTER_IMAGE=aun-sdk-tester-main-dist:latest`
218
225
  - `AUN_TS_TESTER_IMAGE=aun-ts-sdk-tester-main-dist:local`
219
226
  - `AUN_JS_TESTER_IMAGE=aun-js-sdk-tester-main-dist:local`
220
- - `AUN_ISSUER_DOMAIN=dist-agentid.pub`
227
+ - `AUN_ISSUER_DOMAIN=dist-agentid.pub`
221
228
  - `AUN_CONTROL_BASE_URL=https://aun-console.dist-agentid.pub:19876`
222
- - `AUN_GATEWAY_URL=wss://gateway.dist-agentid.pub:20001/aun`
229
+ - `AUN_GATEWAY_URL=wss://gateway.dist-agentid.pub:20001/aun`
223
230
  - `AUN_WORKER_SUPERVISOR_MODE=auto`
224
231
  - `AUN_VERIFY_SSL=0`
225
232
  - `AUN_CONTROL_STORE_BACKEND=mysql`
226
233
  - `AUN_CLUSTER_NODES=aun-control:control_master:true:aun-control:managed,aun-node-a:worker_node:false:aun-node-a:managed,aun-node-b:worker_node:false:aun-node-b:managed`
227
234
 
228
235
  Compose 只传 MySQL 的 host、port、user、password,不配置 `KITE_DB_DATABASE`、`KITE_DB_DSN` 或服务专用库名。每个服务使用代码中与 Python 历史实现一致的默认库名;AUN Console 默认使用 `aun_dashboard`。
229
-
230
- control master 会把 AUN 纳管服务的可达 endpoint 上报到同一个
231
- aun_console 注册中心。worker 上的业务服务优先从注册中心发现 Gateway
232
- `business_ws`,nameservice 在生成 302 跳转时优先使用注册中心的
233
- `public_http`,没有注册中心记录时才回退到本地域名 + 默认端口。
234
- storage 的数据平面原生 HTTPS 地址仍由 storage RPC 自身按业务语义返回,不作为
235
- Gateway service-plane 自动连接路径。
236
-
237
- 默认宿主机端口映射和注册中心公开 endpoint:
238
-
239
- | 服务 | 容器监听 | 宿主机端口变量 | 默认宿主机端口 | 注册中心公开 host |
240
- | --- | --- | --- | --- | --- |
236
+
237
+ control master 会把 AUN 纳管服务的可达 endpoint 上报到同一个
238
+ aun_console 注册中心。worker 上的业务服务优先从注册中心发现 Gateway
239
+ `business_ws`,nameservice 在生成 302 跳转时优先使用注册中心的
240
+ `public_http`,没有注册中心记录时才回退到本地域名 + 默认端口。
241
+ storage 的数据平面原生 HTTPS 地址仍由 storage RPC 自身按业务语义返回,不作为
242
+ Gateway service-plane 自动连接路径。
243
+
244
+ 默认宿主机端口映射和注册中心公开 endpoint:
245
+
246
+ | 服务 | 容器监听 | 宿主机端口变量 | 默认宿主机端口 | 注册中心公开 host |
247
+ | --- | --- | --- | --- | --- |
241
248
  | AUN Console / 控制中心 / 注册中心 / 配置中心 | `19876` | `AUN_CONSOLE_PORT` | `39876` | `aun-console.dist-agentid.pub` |
242
249
  | Gateway client plane | `20001` | `GATEWAY_PORT` | `40001` | `gateway.dist-agentid.pub` |
243
250
  | Name Service HTTPS | `443` | `NS_HTTPS_PORT` | `38443` | `dist-agentid.pub` |
@@ -247,84 +254,84 @@ Gateway service-plane 自动连接路径。
247
254
  | AID Custody HTTP | `18630` | `AID_CUSTODY_PUBLIC_PORT` | `38630` | `aid_custody.dist-agentid.pub` |
248
255
  | Stream HTTP | `9490` | `STREAM_PUBLIC_PORT` | `39490` | `stream.dist-agentid.pub` |
249
256
  | Service Proxy HTTP | `19890` | `SERVICE_PROXY_PUBLIC_PORT` | `39890` | `proxy.dist-agentid.pub` |
250
-
251
- worker 节点默认只配置 `AUN_PRIVATE_HOST=aun-node-a/aun-node-b` 和各服务
252
- 容器监听端口。未配置公网 host 的 worker 服务不会上报 `public_http`,但会
253
- 上报可供 Docker 网络内服务发现使用的 `private_http`;如果后续需要把 worker
254
- 上的 gateway/storage/group 等服务也暴露到宿主机,需要为对应节点单独配置
257
+
258
+ worker 节点默认只配置 `AUN_PRIVATE_HOST=aun-node-a/aun-node-b` 和各服务
259
+ 容器监听端口。未配置公网 host 的 worker 服务不会上报 `public_http`,但会
260
+ 上报可供 Docker 网络内服务发现使用的 `private_http`;如果后续需要把 worker
261
+ 上的 gateway/storage/group 等服务也暴露到宿主机,需要为对应节点单独配置
255
262
  公网 host/port,并避免与默认单实例的端口冲突。
256
-
263
+
257
264
  `aun_console` 的 Dashboard 统计数据和控制中心配置/注册/desired-state
258
265
  数据共用代码默认的 MySQL 数据库 `aun_dashboard`,Compose 不重复覆盖库名。控制中心不再使用
259
- `data-dist/control/control-plane/control_plane.sqlite3` 作为分布式环境的
260
- 主存储;该 SQLite 路径只作为未配置 MySQL backend 时的本地回退。
261
-
266
+ `data-dist/control/control-plane/control_plane.sqlite3` 作为分布式环境的
267
+ 主存储;该 SQLite 路径只作为未配置 MySQL backend 时的本地回退。
268
+
262
269
  首次获准执行时,`prepare_dist_materials.py` 会创建 `docker-deploy/data-dist`:
263
-
270
+
264
271
  - `CA/root/root.crt`:从当前 worktree 的 `certool/certs` 复制
265
272
  - `CA/registry/ca.registry.aun.crt`:从当前 worktree 的 `certool/certs` 复制
266
- - `CA/issuer/ca.dist-agentid.pub.crt` 和 `.key`:使用稳定 registry CA 签发
267
- - `AIDs/{service}.dist-agentid.pub`:内置服务 AID 证书和私钥
268
- - `certs/`:运行时可读的 CA 公钥副本、`aun-ca-bundle.crt`、`wildcard.dist-agentid.pub.crt/key`
269
-
273
+ - `CA/issuer/ca.dist-agentid.pub.crt` 和 `.key`:使用稳定 registry CA 签发
274
+ - `AIDs/{service}.dist-agentid.pub`:内置服务 AID 证书和私钥
275
+ - `certs/`:运行时可读的 CA 公钥副本、`aun-ca-bundle.crt`、`wildcard.dist-agentid.pub.crt/key`
276
+
270
277
  脚本不复制默认单实例数据库,也不复制当前 worktree 的 `docker-deploy/data`。
271
-
272
- ### 启动
273
-
274
- ```powershell
278
+
279
+ ### 启动
280
+
281
+ ```powershell
275
282
  cd D:\modelunion\kite\docker-deploy
276
- docker compose --env-file .env.distributed -f docker-compose.distributed.yml config
277
- docker compose --env-file .env.distributed -f docker-compose.distributed.yml up -d
278
- docker compose --env-file .env.distributed -f docker-compose.distributed.yml ps
279
- ```
280
-
281
- 查看控制台:
282
-
283
- ```powershell
283
+ docker compose --env-file .env.distributed -f docker-compose.distributed.yml config
284
+ docker compose --env-file .env.distributed -f docker-compose.distributed.yml up -d
285
+ docker compose --env-file .env.distributed -f docker-compose.distributed.yml ps
286
+ ```
287
+
288
+ 查看控制台:
289
+
290
+ ```powershell
284
291
  https://localhost:39876
285
- ```
286
-
287
- 进入 `控制中心` 页面,确认能看到:
288
-
289
- - `control master`
290
- - `worker node`:`aun-node-a`、`aun-node-b`
291
- - 节点心跳、控制模式、来源、公网 IP、内网 IP、启用/停用状态
292
- - control master 默认启用,`AUN_CLUSTER_NODES` 中配置的 worker 默认停用,控制模式默认 `managed`
293
- - worker 容器运行完整 `python main.py --no-tls` Kite 实例,启动 kernel + watchdog,并通过 `AUN_LAUNCHER_DEFER_MODULE_START=true` 延迟 AUN 业务模块自动启动
294
- - worker 容器默认以 `auto` 接入,实际执行 `managed`、`report_only` 还是 `unmanaged` 由控制中心节点配置下发;`managed` 模式由 launcher 根据 desired-state 走标准模块生命周期启停模块
295
- - 未配置但动态注册上来的节点可以显示在控制中心,默认 `unmanaged`、停用且服务目标全为 stopped;在控制台启用或编辑后会持久化为已配置节点记录
296
- - 每个节点都显示同一套 AUN 纳管服务清单,并可通过开关写入 desired-state
297
- - 期望服务槽、观察到的服务槽、服务准入策略
298
- - worker launcher 默认通过 `AUN_SUPERVISOR_WATCH_ENABLED=1` 与 control master 建立 `/internal/v1/nodes/{node_id}/watch` WebSocket watch;控制台切换节点或服务开关后应立即看到 `control watch event type=desired_state.changed`,HTTP 定时 report 只作为心跳和兜底同步
299
- - 浏览器控制中心页面会通过当前登录 token 连接 `/api/v1/control/watch`,开关写入后进入短时快速刷新,页面上的 target / observed / action 不应等待 10 秒普通轮询才收敛
300
-
301
- 控制中心表与 Dashboard rollup 表在同一 MySQL 库中,可用以下命令核查:
302
-
303
- ```powershell
292
+ ```
293
+
294
+ 进入 `控制中心` 页面,确认能看到:
295
+
296
+ - `control master`
297
+ - `worker node`:`aun-node-a`、`aun-node-b`
298
+ - 节点心跳、控制模式、来源、公网 IP、内网 IP、启用/停用状态
299
+ - control master 默认启用,`AUN_CLUSTER_NODES` 中配置的 worker 默认停用,控制模式默认 `managed`
300
+ - worker 容器运行完整 `python main.py --no-tls` Kite 实例,启动 kernel + watchdog,并通过 `AUN_LAUNCHER_DEFER_MODULE_START=true` 延迟 AUN 业务模块自动启动
301
+ - worker 容器默认以 `auto` 接入,实际执行 `managed`、`report_only` 还是 `unmanaged` 由控制中心节点配置下发;`managed` 模式由 launcher 根据 desired-state 走标准模块生命周期启停模块
302
+ - 未配置但动态注册上来的节点可以显示在控制中心,默认 `unmanaged`、停用且服务目标全为 stopped;在控制台启用或编辑后会持久化为已配置节点记录
303
+ - 每个节点都显示同一套 AUN 纳管服务清单,并可通过开关写入 desired-state
304
+ - 期望服务槽、观察到的服务槽、服务准入策略
305
+ - worker launcher 默认通过 `AUN_SUPERVISOR_WATCH_ENABLED=1` 与 control master 建立 `/internal/v1/nodes/{node_id}/watch` WebSocket watch;控制台切换节点或服务开关后应立即看到 `control watch event type=desired_state.changed`,HTTP 定时 report 只作为心跳和兜底同步
306
+ - 浏览器控制中心页面会通过当前登录 token 连接 `/api/v1/control/watch`,开关写入后进入短时快速刷新,页面上的 target / observed / action 不应等待 10 秒普通轮询才收敛
307
+
308
+ 控制中心表与 Dashboard rollup 表在同一 MySQL 库中,可用以下命令核查:
309
+
310
+ ```powershell
304
311
  docker exec kite-main-dist-mysql sh -lc 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "SHOW TABLES FROM aun_dashboard;"'
305
- ```
306
-
307
- 查看日志:
308
-
309
- ```powershell
312
+ ```
313
+
314
+ 查看日志:
315
+
316
+ ```powershell
310
317
  docker logs --since 10m kite-main-dist-aun-control
311
- docker compose --env-file .env.distributed -f docker-compose.distributed.yml logs -f aun-node-a
312
- ```
313
-
314
- worker 节点默认从控制中心同步控制模式。`managed` 模式会按 desired-state 执行启停;动作由 worker 本机 launcher 调用现有 `launcher.start_module` / `launcher.stop_module` 路径完成,watchdog 继续负责健康监控和异常重启。业务服务集群化仍不作为本阶段验收重点。control endpoint 使用 `wildcard.dist-agentid.pub.crt/key` 开启本地 HTTPS/WSS;nameservice 所在节点也使用同一证书提供 HTTPS。三机 Docker 网络内的 `aun-dns` 会把已部署服务域名解析到对应 node,把未知的 `*.dist-agentid.pub` 动态 AID 域名解析到当前承载 nameservice 的节点;SDK discovery 必须先访问 `https://{aid}/.well-known/aun-gateway`,例如 `https://alice.dist-agentid.pub/.well-known/aun-gateway` 或 `https://eve-xxx.dist-agentid.pub/.well-known/aun-gateway`,失败后才回退 `https://gateway.dist-agentid.pub/.well-known/aun-gateway`。
315
-
316
- 服务开关的即时性可用以下日志验收:
317
-
318
- ```powershell
318
+ docker compose --env-file .env.distributed -f docker-compose.distributed.yml logs -f aun-node-a
319
+ ```
320
+
321
+ worker 节点默认从控制中心同步控制模式。`managed` 模式会按 desired-state 执行启停;动作由 worker 本机 launcher 调用现有 `launcher.start_module` / `launcher.stop_module` 路径完成,watchdog 继续负责健康监控和异常重启。业务服务集群化仍不作为本阶段验收重点。control endpoint 使用 `wildcard.dist-agentid.pub.crt/key` 开启本地 HTTPS/WSS;nameservice 所在节点也使用同一证书提供 HTTPS。三机 Docker 网络内的 `aun-dns` 会把已部署服务域名解析到对应 node,把未知的 `*.dist-agentid.pub` 动态 AID 域名解析到当前承载 nameservice 的节点;SDK discovery 必须先访问 `https://{aid}/.well-known/aun-gateway`,例如 `https://alice.dist-agentid.pub/.well-known/aun-gateway` 或 `https://eve-xxx.dist-agentid.pub/.well-known/aun-gateway`,失败后才回退 `https://gateway.dist-agentid.pub/.well-known/aun-gateway`。
322
+
323
+ 服务开关的即时性可用以下日志验收:
324
+
325
+ ```powershell
319
326
  docker exec kite-main-dist-aun-node-a sh -lc 'grep -a "control watch\|control supervisor diff\|auth" /data/kite-workspace/app/launcher/log/latest.log | tail -n 30'
320
- ```
321
-
322
- 期望看到 `control supervisor diff reason=watch:desired_state.changed`,而不是等下一次 10 秒轮询才执行。停用服务时,launcher 会先把 per-module target 同步给本机 kernel,避免 kernel 自动伸缩重新拉起控制中心目标为 `stopped` 的模块。
323
-
324
- ### 分布式 SDK tester
325
-
327
+ ```
328
+
329
+ 期望看到 `control supervisor diff reason=watch:desired_state.changed`,而不是等下一次 10 秒轮询才执行。停用服务时,launcher 会先把 per-module target 同步给本机 kernel,避免 kernel 自动伸缩重新拉起控制中心目标为 `stopped` 的模块。
330
+
331
+ ### 分布式 SDK tester
332
+
326
333
  四语言 SDK Tester 使用独立 Compose project,不复用默认单实例或相邻 worktree 的 Tester 容器和数据目录。它们只挂载当前 worktree 的 SDK 源码、`extensions` 与共享契约 `aun-sdk-core/tests/contracts -> /contracts:ro`,并统一设置 `AUN_CONTRACTS_ROOT=/contracts`;连接三节点分布式网络 `kite-main-dist-worktree_kite-distributed-net`,测试数据写入当前 worktree 的 `docker-deploy/data-dist/sdk-testers/*`。
327
-
334
+
328
335
  第一次从当前 worktree 接管 Tester,或 Compose/镜像发生变化时,必须在独立依赖准备阶段重建容器,使 Compose label 和 bind mount 从旧 worktree 切到当前目录。五个依赖卷在 Compose 中声明为带 `kite-main-dist-sdk-testers_` 前缀的 external volume,防止 Compose 自动新建空卷或随 project 清理;缺卷时应停止并完成离线克隆/准备。该阶段只使用已经离线准备的镜像与 named volume,入口不会执行 `apt`、`pip` 或 `npm install`:
329
336
 
330
337
  ```powershell
@@ -368,100 +375,102 @@ docker compose --env-file .env.distributed -f docker-compose.distributed-testers
368
375
  Docker Desktop 可能把 Windows bind source 返回为 `/run/desktop/mnt/host/<盘符>/...`;所有来源核验都必须先归一化,不能直接把这种路径判为其他 worktree。
369
376
 
370
377
  断网业务测试阶段不得使用 `up` 或 `--force-recreate`。现有容器和 named volume 已具备 Linux 依赖时只执行 `start`;如果容器不存在、来源错误或依赖不完整,立即停止,回到独立依赖准备阶段,不能让业务测试访问外网。
371
-
372
- 容器名:
373
-
378
+
379
+ 容器名:
380
+
374
381
  - `main-dist-python-sdk-tester`
375
382
  - `main-dist-go-sdk-tester`
376
383
  - `main-dist-ts-sdk-tester`
377
384
  - `main-dist-js-sdk-tester`
378
-
379
- 四个 tester 默认环境:
380
-
381
- - `AUN_TEST_ISSUER=dist-agentid.pub`
382
- - `AUN_GATEWAY_AID=gateway.dist-agentid.pub`
383
- - `AUN_VERIFY_SSL=0`
384
- - `AUN_ENV=development`
385
- - `AUN_DATA_ROOT=/data/aun`
385
+
386
+ 四个 tester 默认环境:
387
+
388
+ - `AUN_TEST_ISSUER=dist-agentid.pub`
389
+ - `AUN_GATEWAY_AID=gateway.dist-agentid.pub`
390
+ - `AUN_VERIFY_SSL=0`
391
+ - `AUN_ENV=development`
392
+ - `AUN_DATA_ROOT=/data/aun`
393
+ - Python Tester 固定使用 `python:3.11-bookworm`,并设置 `AUN_SDK_UVLOOP=0`、`AUN_CLI_UVLOOP=0`、`AUN_BENCH_UVLOOP=0`;镜像内不安装 `uvloop`
386
394
  - Go Tester 使用 `golang:1.24-bookworm` 和已准备的 named `GOMODCACHE`,并设置 `GOFLAGS=-mod=mod`、`GOPROXY=off`、`GOSUMDB=off`;当前 worktree 没有 `go/vendor`,不得写成 `-mod=vendor`
387
395
  - JS browser E2E tester 使用依赖准备阶段已有的 Google Chrome,并设置
388
396
  `AUN_TEST_DISABLE_LOCAL_DOCKER_PIN=1`,让浏览器使用 Docker DNS 访问
389
- `gateway.dist-agentid.pub`,而不是把域名 pin 到容器内的 `127.0.0.1`
397
+ `gateway.dist-agentid.pub`,而不是把域名 pin 到容器内的 `127.0.0.1`
390
398
  - tester 容器显式使用 `aun-dns` (`172.31.89.53`);它把动态 AID 域名解析到 nameservice,把 `gateway.dist-agentid.pub`、`storage.dist-agentid.pub` 等服务域名解析到当前部署节点。`nameservice` 不应通过 smoke/migration 脚本迁移;迁移任何带 DNS 名称的服务时,必须同步更新 Docker DNS/Corefile 和 compose 网络别名并重启相关容器;生产环境对应修改 DNS。
391
-
392
- 运行单元测试:
393
-
394
- ```powershell
399
+
400
+ 运行单元测试:
401
+
402
+ ```powershell
395
403
  docker exec main-dist-python-sdk-tester python -m pytest /workspace/python/tests/unit -q --tb=short --disable-warnings -k "not reconnect and not mail"
396
404
  docker exec main-dist-go-sdk-tester sh -lc "cd /workspace/go && /usr/local/go/bin/go version && /usr/local/go/bin/go test ./... -mod=mod -count=1 -run '^(Test|Example)' -skip '(?i)(reconnect|mail)'"
397
405
  docker exec main-dist-ts-sdk-tester bash -lc "cd /workspace/ts && npm run test:unit -- --no-file-parallelism --maxWorkers=1"
398
406
  docker exec main-dist-js-sdk-tester bash -lc "cd /workspace/js && npm run test:unit -- --no-file-parallelism --maxWorkers=1"
399
- ```
400
-
401
- 停止 tester:
402
-
403
- ```powershell
407
+ ```
408
+
409
+ 停止 tester:
410
+
411
+ ```powershell
404
412
  cd D:\modelunion\kite\docker-deploy
405
- docker compose --env-file .env.distributed -f docker-compose.distributed-testers.yml down
406
- ```
407
-
408
- 不要加 `-v`,除非明确要清空 `data-dist/sdk-testers` 和分布式 tester 的 named volumes。
409
-
410
- ### Python SDK smoke
411
-
413
+ docker compose --env-file .env.distributed -f docker-compose.distributed-testers.yml down
414
+ ```
415
+
416
+ 不要加 `-v`,除非明确要清空 `data-dist/sdk-testers` 和分布式 tester 的 named volumes。
417
+
418
+ ### Python SDK smoke
419
+
412
420
  优先使用 `main-dist-python-sdk-tester`。如果只想临时跑一个 Python 用例,也可以从同一个 Docker 网络临时起测试容器:
413
-
414
- ```powershell
421
+
422
+ ```powershell
415
423
  cd D:\modelunion\kite\docker-deploy
416
- $repo = (Resolve-Path ..).Path
424
+ $repo = (Resolve-Path ..).Path
417
425
  docker run --rm --network kite-main-dist-worktree_kite-distributed-net `
418
- -v "$repo\aun-sdk-core\python\src:/sdk/src:ro" `
419
- -v "$repo\aun-sdk-core\python\tests:/tests:ro" `
420
- -v "$repo\docker-deploy\data-dist\sdk-tester-aun:/data/aun" `
421
- -e PYTHONPATH=/sdk/src `
422
- -e AUN_ENV=development `
423
- -e AUN_VERIFY_SSL=0 `
424
- -e AUN_DATA_ROOT=/data/aun `
425
- -e AUN_TEST_AUN_PATH=/data/aun/single-domain/persistent `
426
- -e AUN_TEST_ISSUER=dist-agentid.pub `
427
- -e AUN_TEST_ALICE_AID=alice.dist-agentid.pub `
428
- -e AUN_TEST_BOB_AID=bobb.dist-agentid.pub `
426
+ -v "$repo\aun-sdk-core\python\src:/sdk/src:ro" `
427
+ -v "$repo\aun-sdk-core\python\tests:/tests:ro" `
428
+ -v "$repo\docker-deploy\data-dist\sdk-tester-aun:/data/aun" `
429
+ -e PYTHONPATH=/sdk/src `
430
+ -e AUN_ENV=development `
431
+ -e AUN_VERIFY_SSL=0 `
432
+ -e AUN_DATA_ROOT=/data/aun `
433
+ -e AUN_TEST_AUN_PATH=/data/aun/single-domain/persistent `
434
+ -e AUN_SDK_UVLOOP=0 -e AUN_CLI_UVLOOP=0 -e AUN_BENCH_UVLOOP=0 `
435
+ -e AUN_TEST_ISSUER=dist-agentid.pub `
436
+ -e AUN_TEST_ALICE_AID=alice.dist-agentid.pub `
437
+ -e AUN_TEST_BOB_AID=bobb.dist-agentid.pub `
429
438
  aun-sdk-tester-main-dist:latest python -X utf8 /tests/integration_test_message_ack.py
430
- ```
431
-
432
- 按改动范围继续跑非 reconnect / 非 mail 用例。当前 Python 目录没有独立的
433
- `e2e_test_v2_group_e2ee.py`;Group E2EE E2E 分散在 1DH wrap、slot 前缀隔离、
434
- proximity、thought 和 recall 场景里。先跑已通过的主链路:
435
-
436
- ```powershell
439
+ ```
440
+
441
+ 按改动范围继续跑非 reconnect / 非 mail 用例。当前 Python 目录没有独立的
442
+ `e2e_test_v2_group_e2ee.py`;Group E2EE E2E 分散在 1DH wrap、slot 前缀隔离、
443
+ proximity、thought 和 recall 场景里。先跑已通过的主链路:
444
+
445
+ ```powershell
437
446
  docker exec main-dist-python-sdk-tester sh -lc "python -X utf8 /workspace/python/tests/integration_test_gap_fill.py && python -X utf8 /workspace/python/tests/e2e_test_v2_p2p_e2ee.py && python -X utf8 /workspace/python/tests/e2e_test_v2_1dh_wrap.py && python -X utf8 /workspace/python/tests/e2e_test_slot_id_separator.py && python -X utf8 /workspace/python/tests/e2e_test_proximity.py && python -X utf8 /workspace/python/tests/e2e_test_v2_thought.py"
438
447
  docker exec main-dist-ts-sdk-tester bash -lc "cd /workspace/ts && node_modules/.bin/vitest run tests/integration/group-e2ee.test.ts tests/e2e/v2-group.test.ts tests/e2e/v2-thought.test.ts tests/e2e/slot-id-separator.test.ts --no-file-parallelism --maxWorkers=1"
439
448
  docker exec main-dist-js-sdk-tester bash -lc "cd /workspace/js && node_modules/.bin/vitest run --environment jsdom tests/integration/v2-thought.test.ts --no-file-parallelism --maxWorkers=1 && npm run build && node_modules/.bin/playwright test --config=playwright.agentid-local.config.ts tests/e2e-browser/v2-group.spec.ts tests/e2e-browser/v2-thought.spec.ts --reporter=line"
440
449
  docker exec main-dist-go-sdk-tester bash -lc "cd /workspace/go && /usr/local/go/bin/go test -tags integration -count=1 -run 'TestV2Group|TestV2Thought_FullFlow|TestSlotSeparatorE2E_GroupEncrypted|TestGroupUndecryptableEventOnly|TestGroupRecall' ."
441
- ```
442
-
443
- Python encrypted group recall 去重当前仍需复核,单独运行并参考
444
- `test-artifacts/distributed-test-buglist.md`:
445
-
446
- ```powershell
450
+ ```
451
+
452
+ Python encrypted group recall 去重当前仍需复核,单独运行并参考
453
+ `test-artifacts/distributed-test-buglist.md`:
454
+
455
+ ```powershell
447
456
  docker exec main-dist-python-sdk-tester sh -lc "python -X utf8 /workspace/python/tests/integration_test_group_recall.py"
448
- ```
449
-
450
- ### Cross-SDK 分布式 tester
451
-
457
+ ```
458
+
459
+ ### Cross-SDK 分布式 tester
460
+
452
461
  分布式 cross-sdk 使用专用 compose 文件,不复用默认 `cross-sdk-*` 容器、`tests/cross-sdk/data` 或 `tests/cross-sdk/artifacts`。测试数据写入 `aun-sdk-core/tests/cross-sdk/data-dist`,产物写入 `aun-sdk-core/tests/cross-sdk/artifacts-dist`。TS/JS/Go 的五个离线依赖卷使用 `kite-main-dist-cross-sdk_` 前缀并声明为 external;不得复用相邻 worktree 的 `kite-dist-cross-sdk_*` 卷。
453
-
454
- ```powershell
462
+
463
+ ```powershell
455
464
  cd D:\modelunion\kite\aun-sdk-core
456
465
  docker image inspect aun-sdk-tester-main-dist:latest node:22-bookworm golang:1.24-bookworm | Out-Null
457
466
  if ($LASTEXITCODE -ne 0) { throw '分布式 cross-SDK 镜像未完成离线准备,停止测试' }
458
467
  docker compose --env-file ../docker-deploy/.env.distributed -f tests/cross-sdk/docker-compose.cross-sdk.distributed.yml config
459
468
  docker compose --env-file ../docker-deploy/.env.distributed -f tests/cross-sdk/docker-compose.cross-sdk.distributed.yml up --force-recreate --abort-on-container-exit --exit-code-from dist-cross-sdk-runner
460
- ```
461
-
469
+ ```
470
+
462
471
  默认使用当前分支实际存在的 `cases.inbox-migration.json`。如需指定其他 cases 文件:
463
-
464
- ```powershell
472
+
473
+ ```powershell
465
474
  $env:CROSS_SDK_CASES_BASENAME="cases.inbox-migration.json"
466
475
  ```
467
476
 
@@ -473,21 +482,21 @@ docker compose --env-file ../docker-deploy/.env.distributed -f tests/cross-sdk/d
473
482
  ```
474
483
 
475
484
  该场景按 Python → TypeScript → Go → JavaScript 串行执行。Go Agent 必须使用 Go 1.24、`-tags crosssdk`、`GOPROXY=off` 和 `GOSUMDB=off`。`history_e2ee=false` 只用于隔离已知 E2EE 收件超时,不能作为 E2EE 验收结果。
476
-
477
- 分布式 cross-sdk 默认会为每个 agent 生成本次运行唯一 AID,避免持久 CA 中已有固定测试身份时出现 `IDENTITY_CONFLICT`。如果需要让四个 agent 使用同一个可读运行标识,可在启动前设置:
478
-
479
- ```powershell
480
- $env:CROSS_SDK_RUN_ID="manual-$(Get-Date -Format yyyyMMddHHmmss)"
481
- ```
482
-
483
- 如需指定某个 agent 的固定身份,仍可显式设置 `CROSS_SDK_PY_AID`、`CROSS_SDK_TS_AID`、`CROSS_SDK_GO_AID`、`CROSS_SDK_JS_AID`。
484
-
485
- 跑完后清理容器即可,不要加 `-v`:
486
-
487
- ```powershell
485
+
486
+ 分布式 cross-sdk 默认会为每个 agent 生成本次运行唯一 AID,避免持久 CA 中已有固定测试身份时出现 `IDENTITY_CONFLICT`。如果需要让四个 agent 使用同一个可读运行标识,可在启动前设置:
487
+
488
+ ```powershell
489
+ $env:CROSS_SDK_RUN_ID="manual-$(Get-Date -Format yyyyMMddHHmmss)"
490
+ ```
491
+
492
+ 如需指定某个 agent 的固定身份,仍可显式设置 `CROSS_SDK_PY_AID`、`CROSS_SDK_TS_AID`、`CROSS_SDK_GO_AID`、`CROSS_SDK_JS_AID`。
493
+
494
+ 跑完后清理容器即可,不要加 `-v`:
495
+
496
+ ```powershell
488
497
  docker compose --env-file ../docker-deploy/.env.distributed -f tests/cross-sdk/docker-compose.cross-sdk.distributed.yml down
489
- ```
490
-
498
+ ```
499
+
491
500
  ## 本地 agentid.pub / agentid.cn 双域 Docker 跨域测试
492
501
 
493
502
  ### 定位与验收边界
@@ -497,15 +506,18 @@ docker compose --env-file ../docker-deploy/.env.distributed -f tests/cross-sdk/d
497
506
  本环境验证的是本地完整调用链:
498
507
 
499
508
  ```text
500
- 本域 SDK -> 本域 Gateway -> 按 receiver/group/owner AID issuer 判域
501
- -> 远端 Gateway -> 远端 Message/Group/Storage -> 回包或事件反向返回
509
+ 本域 SDK -> 本域 Gateway -> 按 receiver/group/owner/target AID issuer 判域
510
+ -> 远端 Gateway -> 远端 Message/Group/Storage/Collab
511
+ -> 回包,或由 Gateway 把联邦事件反向投递给目标 SDK
502
512
  ```
503
513
 
514
+ 联邦身份只在 `Gateway <-> Gateway` 的 `federation.hello` / `federation.relay` 网络边界鉴定。远端 Gateway 将已经绑定的 `from_issuer` 转换为受信 `_federation` 上下文后,域内 `Gateway -> Service`、`Service -> Service` 不得再次要求或鉴定联邦身份。`group.fs.*` 必须按二跳链路验收:Group 完成本域成员授权并生成受信上下文,再经两端 Gateway 到 Storage;Storage 只消费 Gateway 恢复的域内上下文,不能自行信任客户端伪造标记。
515
+
504
516
  跨域 Group 有两个不同的持久化事实,测试必须同时证明:群所属域保存权威成员关系;成员所属域保存该本域 AID 的远端群目录,使 `group.list_my` 不依赖 SDK 历史缓存逐群盲拉。`group.pull` / `group.v2.pull` 仍按 `group_id` 的 issuer 路由到群所属域,并在该域做成员校验;不得在成员本域拿远端群成员表做最终授权判断。
505
517
 
506
518
  ### 每轮执行顺序
507
519
 
508
- 每轮开始和结束都重新阅读 [AUN 测试运行指南](aun测试运行指南.md),确认身份保护、镜像重建和测试串行规则没有变化。固定顺序为:只读材料校验 -> 必要时构建镜像 -> 启动两域 -> 来源与 Go runtime 核验 -> 双向发现 -> P2P -> Group -> Storage OSS -> 采集两域日志。任一前置门禁失败即停止,不得用重签证书、`setup_aids.py`、清库或删除 SDK 身份绕过。
520
+ 每轮开始和结束都重新阅读 [AUN 测试运行指南](aun测试运行指南.md),确认身份保护、镜像重建和测试串行规则没有变化。固定顺序为:只读材料校验 -> 必要时构建镜像 -> 启动两域 -> 来源与 Go runtime 核验 -> 双向发现 -> 联邦身份边界 -> Notify -> Stream -> P2P -> Group -> Group FS -> Collab -> Storage OSS -> 采集两域日志。当前明确跳过 Mail 和 reconnect。任一前置门禁失败即停止,不得用重签证书、`setup_aids.py`、清库或删除 SDK 身份绕过。
509
521
 
510
522
  ### 材料校验与镜像构建
511
523
 
@@ -587,7 +599,7 @@ $leaked = $dbContainers | Where-Object { $_.NetworkSettings.Networks.'kite-agent
587
599
  if ($leaked) { throw "数据库或 Redis 错误接入 federation 网络: $($leaked.Name -join ', ')" }
588
600
  ```
589
601
 
590
- 再核对每域最近一次 supervisor 报告均为 `desired_running=13`、`observed_running=13`、`service_errors=0`,并检查镜像内 runtime:
602
+ 再核对每域最近一次 supervisor 报告的自动启动服务均已 ready、`service_errors=0`,并检查镜像内 runtime。当前 manifest 有 13 个服务槽位,其中 `push` 明确为 `manual_control: true`:默认 pub 域不自动启动 Push,因此合法基线是 `desired_slots=13 desired_running=12 observed_slots=13 observed_running=12 service_errors=0`;若显式启动 Push,则对应基线为 13/13。CN 域若保留 Push 的历史 desired 状态,则可为 13/13。不能把 `push` 手动控制状态当作服务故障:
591
603
 
592
604
  ```powershell
593
605
  $goServices = 'auth','ca','gateway','message','group','storage','stream','nameservice','leaderboard','service_proxy'
@@ -596,11 +608,18 @@ foreach ($container in 'kite-app','kite-agentid-cn-local-app') {
596
608
  $runtime = docker exec $container sh -lc "grep '^runtime:' /app/extensions/services/$service/module.md"
597
609
  if ($runtime -ne 'runtime: binary') { throw "$container/$service 未运行 Go manifest: $runtime" }
598
610
  }
599
- $report = docker logs --since 2m $container 2>&1 |
600
- Select-String 'desired_running=13 observed_slots=13 observed_running=13' |
601
- Select-Object -Last 1
602
- if (-not $report -or $report.Line -notmatch 'service_errors=0') {
603
- throw "$container 尚未达到 13/13 healthy"
611
+ $reports = docker logs --since 2m $container 2>&1 |
612
+ Select-String 'desired_slots=13 desired_running=' |
613
+ Select-Object -Last 20
614
+ $report = $reports | Where-Object { $_.Line -match 'service_errors=0' } | Select-Object -Last 1
615
+ if (-not $report) { throw "$container supervisor 仍有服务错误" }
616
+ if ($container -eq 'kite-app' -and
617
+ $report.Line -notmatch 'desired_running=(12|13) observed_slots=13 observed_running=(12|13)') {
618
+ throw "$container 未达到 manual-control 基线: $($report.Line)"
619
+ }
620
+ if ($container -eq 'kite-agentid-cn-local-app' -and
621
+ $report.Line -notmatch 'desired_running=(12|13) observed_slots=13 observed_running=(12|13)') {
622
+ throw "$container 未达到 manual-control 基线: $($report.Line)"
604
623
  }
605
624
  }
606
625
  ```
@@ -630,7 +649,79 @@ agentid.cn: D:\modelunion\kite\docker-deploy\data-agentid-cn\sdk-testers\python
630
649
 
631
650
  脚本在容器内分别只读挂载为 `/identities/pub` 和 `/identities/cn`,运行状态写入临时 `/tmp/aun-e2e`。若 cn 尚无可用身份,可以在老大明确授权的注册流程中创建专用测试 AID,并将材料放入 cn 的固定测试根;日常回归不得自动注册、重签或扫描其他身份目录。不得运行会自动生成随机真实域 AID 的 federation 脚本;`federation-test/tests/e2e_group.py` 和 `e2e_storage.py` 默认会创建身份,只能用于后文 `dist-aid.*` 隔离环境。
632
651
 
633
- 每轮生成唯一 `run_id`,并记录 sender AID、receiver AID、group ID、message ID/seq、Storage owner/path 和起止时间。P2P、Group、Storage 串行执行,避免固定身份的游标、目录和本地缓存相互污染。
652
+ 每个阶段生成唯一 `run_id`,并记录 sender AID、receiver AID、group ID、message ID/seq、Stream ID、Storage owner/path 和起止时间。所有真实域阶段串行执行,避免固定身份的游标、目录和本地缓存相互污染。阶段失败后修复并从该阶段继续;已经成功的阶段不得反复运行。
653
+
654
+ ### 联邦身份边界验收
655
+
656
+ `federation-boundary` 直接连接两端 Gateway 的 federation WebSocket,双向验证:未认证 relay 拒绝、缺失/错误签名拒绝、证书 CN 与 `from_issuer` 不一致拒绝、双向服务端签名验证、RPC sender 绑定、允许事件的 sender 绑定,以及 Group FS 二跳上下文的版本、issuer、group、actor、owner、bucket、path 绑定。这个阶段只证明 Gateway 网络边界;不能用域内 Service RPC 成功替代。
657
+
658
+ ### 全阶段运行入口
659
+
660
+ 以下命令复用固定身份并只读挂载两域 Gateway 身份/CA。`$phases` 默认是完整发布门禁;从失败点续跑时只保留失败阶段和其后尚未执行的阶段,不要重复已成功阶段:
661
+
662
+ ```powershell
663
+ cd D:\modelunion\kite\docker-deploy
664
+ $phases = @(
665
+ 'federation-boundary', 'notify', 'stream', 'p2p',
666
+ 'group', 'group-fs', 'collab', 'storage'
667
+ )
668
+ foreach ($phase in $phases) {
669
+ $testSince = (Get-Date).ToUniversalTime().ToString('o')
670
+ $stamp = (Get-Date).ToUniversalTime().ToString('yyyyMMddHHmmss')
671
+ $runId = "agentid-$phase-$stamp"
672
+ $prefix = Join-Path (Get-Location) "$phase-$runId"
673
+ docker run --rm --network kite-agentid-federation-net `
674
+ -v "D:\modelunion\kite\aun-sdk-core\python\src:/sdk/src:ro" `
675
+ -v "D:\modelunion\kite\docker-deploy\tests\agentid_cross_domain_e2e.py:/tests/agentid_cross_domain_e2e.py:ro" `
676
+ -v "D:\modelunion\kite\docker-deploy\data\extended-acceptance\group-management:/identities/pub:ro" `
677
+ -v "D:\modelunion\kite\docker-deploy\data-agentid-cn\sdk-testers\python-fixed:/identities/cn:ro" `
678
+ -v "D:\modelunion\kite\docker-deploy\data\CA:/server-data/pub/CA:ro" `
679
+ -v "D:\modelunion\kite\docker-deploy\data\AIDs:/server-data/pub/AIDs:ro" `
680
+ -v "D:\modelunion\kite\docker-deploy\data-agentid-cn\CA:/server-data/cn/CA:ro" `
681
+ -v "D:\modelunion\kite\docker-deploy\data-agentid-cn\AIDs:/server-data/cn/AIDs:ro" `
682
+ -e PYTHONPATH=/sdk/src `
683
+ -e AUN_E2E_PUB_IDENTITY_ROOT=/identities/pub `
684
+ -e AUN_E2E_CN_IDENTITY_ROOT=/identities/cn `
685
+ -e AUN_E2E_CN_ENCRYPTION_SEED=cross-domain-e2e-v1 `
686
+ -e AUN_E2E_RUN_ROOT=/tmp/aun-e2e `
687
+ -e AUN_SDK_UVLOOP=0 -e AUN_CLI_UVLOOP=0 -e AUN_BENCH_UVLOOP=0 `
688
+ -e HTTP_PROXY= -e HTTPS_PROXY= -e ALL_PROXY= -e NO_PROXY=* `
689
+ aun-sdk-tester:latest python /tests/agentid_cross_domain_e2e.py `
690
+ --phase $phase --skip-reconnect --run-id $runId 2>&1 |
691
+ Tee-Object "$prefix.runner.log"
692
+ $phaseExit = $LASTEXITCODE
693
+ docker logs --since $testSince kite-app 2>&1 |
694
+ Tee-Object "$prefix.agentid-pub.log" | Out-Null
695
+ docker logs --since $testSince kite-agentid-cn-local-app 2>&1 |
696
+ Tee-Object "$prefix.agentid-cn.log" | Out-Null
697
+ if ($phaseExit -ne 0) { throw "$phase 双域 E2E 失败" }
698
+ }
699
+ ```
700
+
701
+ 除 `federation-boundary` 外,runner 在进入业务阶段前会用全新的运行目录分别完成两域固定身份登录。`auth.aid_login1` 必须依次通过 CA 的 `verify_chain`、`get_cert` 和 `ocsp_query` 数据库查询,因此登录成功就是 CA/Auth 数据库调用链可用的证据;日志必须先出现两条 `DOMAIN_READY ... evidence=aid_login`。`ca.status` 属于域内诊断 RPC,普通 AID 被 Gateway 拒绝是正确权限边界,不得为了预检放宽。任一域登录失败时,runner 会汇总两域结果并在业务 RPC 前停止;此时应先检查对应 MySQL 容器状态和 CA/Auth 重连日志,不能把 `ca.verify_chain: database not connected` 归因于联邦身份边界。
702
+
703
+ 若 MySQL 日志出现 `Trying to access page ... outside the tablespace bounds`、`Server exits` 或 InnoDB assertion failure,只能判定运行中的 InnoDB 已访问非法页并退出,不能仅凭页越界日志判定磁盘数据文件已经物理损坏。立即停止后续业务阶段,保留原容器、挂载、完整错误日志和冷态只读副本;不得通过清库、删除表、替换固定 AID 材料或运行 `setup_aids.py` 掩盖现场。
704
+
705
+ 先在冷启动诊断实例中执行目标表的全索引扫描、`CHECK TABLE ... EXTENDED` 和行数校验,再对冷副本、逻辑重建副本做相同负载与配置 A/B。只有同一文件/页在冷副本上稳定复现,或离线/冷启动校验也失败,才可归为持久化物理损坏;若冷启动校验完整、非法页号每次变化甚至呈现业务字符串字节,则继续检查 `dict_stats_thread` 等后台栈、MySQL 版本对照和宿主机 WHEA,不能归咎前台 SQL。
706
+
707
+ 受控恢复时保留旧数据根,通过 `AUN_MYSQL_DATA_ROOT` 指向新的逻辑恢复目录。Linux named volume 的数据字典通常以 `lower_case_table_names=0` 初始化,不能把物理文件直接复制到 Windows bind mount;Windows bind 会以 `lower_case_table_names=2` 启动并因数据字典不一致拒绝加载,必须先在目标 bind 上初始化空实例,再做逻辑导出/导入。只有错误栈已收敛到 InnoDB 自动统计线程时,才可在故障域的 `local.env` 临时设置 `MYSQL_INNODB_STATS_AUTO_RECALC=OFF`;默认值保持 `ON`,不得未经 A/B 验证扩散到另一域或生产环境。
708
+
709
+ 每个方向都必须出现对应标志,最后还必须有该阶段 `PASS phase=...`:
710
+
711
+ | 阶段 | 必须出现的关键标志 |
712
+ | --- | --- |
713
+ | `federation-boundary` | `FEDERATION_MUTUAL_AUTH_OK`,以及 unauth/signature/issuer/RPC/event/Group-FS marker 的全部 `DENIED` |
714
+ | `notify` | `NOTIFY_CROSS_DOMAIN_OK` |
715
+ | `stream` | `STREAM_CREATED_EVENT_OK`、`STREAM_TARGET_BINDING_OK`、`STREAM_CLOSED_EVENT_OK` |
716
+ | `p2p` | `P2P_ONLINE_OK`、`P2P_ACK_OK`、`P2P_OFFLINE_RECONNECT_SKIPPED` |
717
+ | `group` | `GROUP_AUTHORITY_MEMBER_OK`、`GROUP_REMOTE_PULL_OK`、`GROUP_DIRECTORY_OK`、`GROUP_DIRECTORY_RECONNECT_SKIPPED`、`GROUP_MESSAGE_ONLINE_PULL_OK`、`GROUP_LEAVE_OK`、`GROUP_AID_CERT_OK` |
718
+ | `group-fs` | `GROUP_FS_OWNER_AREA_OK`、`GROUP_FS_NON_MEMBER_DENIED`、`GROUP_FS_MEMBERDATA_DIRECT_OK`、`GROUP_FS_OTHER_MEMBERDATA_DENIED`、`GROUP_FS_STORAGE_BYPASS_DENIED`、`GROUP_FS_MEMBERDATA_OK`、`GROUP_FS_REMOTE_COPY_OK`、`GROUP_FS_ACL_PRE_GRANT_DENIED`、`GROUP_FS_ACL_GRANTED`、`GROUP_FS_ACL_REVOKED_DENIED`、`GROUP_FS_ADMIN_DEFAULT_WRITE_OK`、`GROUP_FS_SHORT_AID_DENIED`、`GROUP_FS_AFTER_LEAVE_DENIED` |
719
+ | `collab` | `COLLAB_CROSS_DOMAIN_READ_OK`、`COLLAB_NON_MEMBER_DENIED`、`COLLAB_STORAGE_BYPASS_DENIED` |
720
+ | `storage` | `STORAGE_LIST_OK`、`STORAGE_RECONNECT_SKIPPED`、`STORAGE_PRIVATE_DENIED_OK`、`STORAGE_TOKEN_OK`、`STORAGE_CROSS_OWNER_ROUTING_OK`、`STORAGE_CLEANUP_OK` |
721
+
722
+ ### Notify 与 Stream 验收
723
+
724
+ Notify 必须双向验证公开 SDK `notify()` 经过 Gateway 联邦事件转发后,接收端得到正确 `_notify.from_aid`。Stream 必须双向验证 `stream/created`、`stream/closed` 公开事件,返回 URL 固定为 `stream.{creator_issuer}:9490`,事件不泄漏 push/pull token;绑定 `target_aid` 后,正确 `X-Stream-AID` 放行,错误或缺失值均返回 `403`。
634
725
 
635
726
  ### P2P 跨域验收
636
727
 
@@ -638,7 +729,7 @@ agentid.cn: D:\modelunion\kite\docker-deploy\data-agentid-cn\sdk-testers\python
638
729
 
639
730
  1. `.agentid.pub` 发送给 `.agentid.cn`,接收端校验 sender、payload、message ID/seq 后 ACK。
640
731
  2. `.agentid.cn` 反向发送给 `.agentid.pub`,执行同样校验。
641
- 3. 接收端离线时发送,再上线 pull 并 ACK,证明远端持久化和回补路径;不能只验证在线 push
732
+ 3. 当前 `--skip-reconnect` 范围明确不执行离线重连回补,必须输出 `P2P_OFFLINE_RECONNECT_SKIPPED`;恢复 reconnect 验收时,才要求接收端离线发送、再上线 pull 并 ACK。
642
733
  4. receiver AID 的 issuer 必须决定远端 Gateway;本域 Message 不得把异域 receiver 当成本地收件人查询后返回 not found。
643
734
 
644
735
  成功标准是发送响应、远端接收、pull/ack 和两域日志中的同一 trace/message ID 全部闭合。仅有 `message.send` 返回成功不算通过;远端超时必须返回明确的 federation unavailable/timeout,不能伪装成接收方不存在。
@@ -649,7 +740,7 @@ agentid.cn: D:\modelunion\kite\docker-deploy\data-agentid-cn\sdk-testers\python
649
740
 
650
741
  1. `group.create` 成功,具名 Group AID 场景最终响应包含 `aid_cert.cert`、`aid_cert.ca_cert`、`aid_cert.cert_sn`;客户端只有收到并持久化证书后才能提交临时私钥,缺字段不得继续邀请、备份或返回假成功。
651
742
  2. 群所属域的 `group.list_members` 出现异域成员,角色正确。
652
- 3. 加群事件到达成员所属域后立即调用 `group.list_my`,必须出现该远端 group ID;断开并重连 SDK 后仍出现,证明来源是本域 Group 持久化目录,不是进程内事件或客户端历史缓存。
743
+ 3. 加群事件到达成员所属域后立即调用 `group.list_my`,必须出现该远端 group ID;当前跳过 reconnect,恢复该范围时还必须断开并重连 SDK 后再次验证。
653
744
  4. 异域成员调用 `group.pull` / `group.v2.pull`,请求必须路由到 group ID 所属域,并由该域权威成员表放行;不得在成员本域报 `member not found`。
654
745
  5. 双方各发送一条 `group.send`,对端通过在线事件和 pull 都能按 seq 读到;验证 ACK/游标后再继续。
655
746
  6. 异域成员 `group.leave` 后,成员所属域的 `group.list_my` 最终移除该群;此后 pull/send 返回 `member not found` 才是合法结果,并应由群所属域产生。
@@ -658,8 +749,24 @@ agentid.cn: D:\modelunion\kite\docker-deploy\data-agentid-cn\sdk-testers\python
658
749
 
659
750
  现有 `dist-aid.*` 的 `e2e_group.py` 覆盖跨域加人、双向群消息、退群和邀请码,但没有证明真实域固定成员的本域 `group.list_my` 持久化,也没有覆盖 `group.create` 的 `aid_cert` 字段契约。因此这两项是当前真实双域发布前必跑门禁,不能由旧脚本通过替代。
660
751
 
752
+ ### Group FS 二跳验收
753
+
754
+ 每个方向都创建临时命名群,覆盖群自有区、成员自己的 `memberdata/{aid}`、直接 Storage owner 路由、ACL 和退群后拒绝。非成员、短 AID、写他人 memberdata、伪造 `storage.*` 绕过必须拒绝;正常请求必须证明 `Group -> 本域 Gateway -> 远端 Gateway -> Storage` 二跳闭合。临时群和本轮唯一目录结束时清理,不删除固定身份、数据库或共享身份目录。
755
+
756
+ ### Collab 跨域验收
757
+
758
+ 每个方向由群身份创建两版文档,异域成员必须通过公开 Collab API 完成 latest/历史版本 `show`、`log`、`diff` 和 `ls_remote`;本域或异域非成员均不得读取。客户端直接调用 `storage.collab.*` 绕过 Collab/群成员授权必须拒绝。
759
+
661
760
  ### Storage OSS 验收
662
761
 
762
+ 本地双域与线上 OSS 配置必须分开:本地 `agentid.cn/local.env` 应保持
763
+ `AUN_STORAGE_BACKEND=localfs`,与镜像内 `storage_config.json` 的默认配置一致;
764
+ 不要把 `agentid.cn/online/go/docker-compose.yml` 的 OSS 环境变量复制到本地。
765
+ 只有在同时提供 `AUN_STORAGE_OSS_ENDPOINT`、`AUN_STORAGE_OSS_BUCKET`、
766
+ `AUN_STORAGE_OSS_ACCESS_KEY` 和 `AUN_STORAGE_OSS_SECRET_KEY` 时才可切换为 `oss`。
767
+ 若本地 CN 被错误覆盖为 `oss` 但缺少凭据,Storage 会在启动阶段退出并让后续业务表现为
768
+ `no_service`,应先恢复 `localfs`、只重建对应 `kite` 容器,再继续测试。
769
+
663
770
  先只输出 backend 名称,禁止打印 OSS AccessKey、Secret 或完整容器环境:
664
771
 
665
772
  ```powershell
@@ -671,36 +778,18 @@ foreach ($container in 'kite-app','kite-agentid-cn-local-app') {
671
778
 
672
779
  重点在 `agentid.cn` 使用已有固定 AID 和唯一 `run_id` 目录完成:创建文件夹 -> 上传小文件(inline/秒传路径)-> 上传大文件(session/OSS PUT/complete 路径)-> `storage.fs.list` 或 `storage.list_objects` 列出两文件 -> 下载并校验 SHA-256。`agentid.pub` 至少重复“文件夹内上传并列出”作为对照。
673
780
 
674
- 上传接口返回成功只说明数据面或 `complete_upload` 返回成功,不代表目录元数据可见。验收必须断言列表出现同一 owner、bucket、规范化 path、size 和内容哈希;重新连接 SDK 后再次 list 仍可见。若 OSS 对象存在而列表没有记录,按 Storage 控制面提交/数据库持久化失败处理,不能归因于客户端刷新。
781
+ 上传接口返回成功只说明数据面或 `complete_upload` 返回成功,不代表目录元数据可见。验收必须断言列表出现同一 owner、bucket、规范化 path、size 和内容哈希;当前跳过 reconnect,恢复该范围时才要求重新连接 SDK 后再次 list。若 OSS 对象存在而列表没有记录,按 Storage 控制面提交/数据库持久化失败处理,不能归因于客户端刷新。
675
782
 
676
783
  跨域 Storage/Group FS 还需用 owner AID 或 group AID 的 issuer 验证路由到所属域;不允许本域 Storage 查询异域 owner 的本地目录后返回空列表。任何清理测试对象的操作只限本轮唯一目录,固定身份目录和数据库不得删除。
677
784
 
678
- 本地双域 Storage 阶段使用临时 runner,同时挂载上面两个固定身份根;以下命令跳过 mail 和 reconnect,只验证上传、列表、权限、token、跨域下载和 SHA-256。业务测试阶段不安装依赖、不创建身份:
785
+ 本地双域 Storage 使用上面的全阶段 runner,只验证上传、列表、权限、token、跨域下载和 SHA-256。日志中应出现两域的 `federation.hello` / `federation.relay`,权限拒绝保持为 `forbidden`;不得被 Gateway 改写成 `-32012` 或泛化的 `StorageError`。
679
786
 
680
- ```powershell
681
- $testSince = (Get-Date).ToUniversalTime().ToString('o')
682
- $runId = 'agentid-storage-' + (Get-Date).ToUniversalTime().ToString('yyyyMMddHHmmss')
683
- docker run --rm --network kite-agentid-federation-net `
684
- -v "D:\modelunion\kite\aun-sdk-core\python\src:/sdk/src:ro" `
685
- -v "D:\modelunion\kite\docker-deploy\tests\agentid_cross_domain_e2e.py:/tests/agentid_cross_domain_e2e.py:ro" `
686
- -v "D:\modelunion\kite\docker-deploy\data\extended-acceptance\group-management:/identities/pub:ro" `
687
- -v "D:\modelunion\kite\docker-deploy\data-agentid-cn\sdk-testers\python-fixed:/identities/cn:ro" `
688
- -e PYTHONPATH=/sdk/src `
689
- -e AUN_E2E_PUB_IDENTITY_ROOT=/identities/pub `
690
- -e AUN_E2E_CN_IDENTITY_ROOT=/identities/cn `
691
- -e AUN_E2E_CN_ENCRYPTION_SEED=cross-domain-e2e-v1 `
692
- -e AUN_E2E_RUN_ROOT=/tmp/aun-e2e `
693
- -e HTTP_PROXY= -e HTTPS_PROXY= -e ALL_PROXY= -e NO_PROXY=* `
694
- aun-sdk-tester:latest python /tests/agentid_cross_domain_e2e.py `
695
- --phase storage --skip-reconnect --run-id $runId
696
- if ($LASTEXITCODE -ne 0) { throw 'Storage 双域 E2E 失败' }
697
- docker logs --since $testSince kite-app 2>&1 |
698
- Tee-Object D:\modelunion\kite\docker-deploy\agentid.pub\latest.log | Out-Null
699
- docker logs --since $testSince kite-agentid-cn-local-app 2>&1 |
700
- Tee-Object D:\modelunion\kite\docker-deploy\agentid.cn\latest.log | Out-Null
701
- ```
787
+ ### 覆盖边界
702
788
 
703
- 成功必须同时看到 `STORAGE_LIST_OK`、`STORAGE_PRIVATE_DENIED_OK`、`STORAGE_TOKEN_OK`、`STORAGE_CROSS_OWNER_ROUTING_OK`、`STORAGE_CLEANUP_OK``PASS phase=storage`。日志中应出现两域的 `federation.hello` / `federation.relay`,权限拒绝保持为 `forbidden`;不得被 Gateway 改写成 `-32012` 或泛化的 `StorageError`。
789
+ - Mailreconnect 当前明确不测,不得把 `SKIPPED` 写成通过。
790
+ - Service Proxy 不属于 Gateway federation relay 白名单;它的双域功能测试验证 provider/proxy 业务路由,不计入 Gateway 联邦身份边界覆盖。
791
+ - V2 加密、Thought 和加密 payload 与 Gateway 联邦身份绑定正交,由后文隔离 `dist-aid.*` 的 `e2e_encrypted.py`、`e2e_v2_cross_domain.py`、`test_e2ee_cross_domain.py` 覆盖;真实域 runner 不重复这些载荷组合。
792
+ - `meta.*` 是 Gateway 本地诊断接口,没有独立跨域业务使用场景;不得为追求 namespace 数量制造无效 E2E。
704
793
 
705
794
  ### 日志采集与根因判定
706
795
 
@@ -761,6 +850,7 @@ foreach ($domain in 'agentid.pub', 'agentid.cn') {
761
850
  -v "${PWD}\python:/workspace/python:ro" `
762
851
  -v "${PWD}\.public-test-data:/public-test-data" `
763
852
  -e AUN_TEST_ENCRYPTION_SEED `
853
+ -e AUN_SDK_UVLOOP=0 -e AUN_CLI_UVLOOP=0 -e AUN_BENCH_UVLOOP=0 `
764
854
  -w /workspace/python `
765
855
  aun-sdk-tester:latest `
766
856
  python -X utf8 run-public-tests.py `
@@ -801,6 +891,7 @@ foreach ($phase in 'p2p', 'group', 'storage') {
801
891
  -e AUN_E2E_CN_ENCRYPTION_SEED=$seed `
802
892
  -e AUN_E2E_RUN_ROOT=/tmp/aun-e2e `
803
893
  -e AUN_E2E_VERIFY_SSL=1 `
894
+ -e AUN_SDK_UVLOOP=0 -e AUN_CLI_UVLOOP=0 -e AUN_BENCH_UVLOOP=0 `
804
895
  -e HTTP_PROXY= -e HTTPS_PROXY= -e ALL_PROXY= -e NO_PROXY=* `
805
896
  aun-sdk-tester:latest python /tests/agentid_cross_domain_e2e.py `
806
897
  --phase $phase --skip-reconnect --run-id $runId
@@ -819,7 +910,7 @@ foreach ($phase in 'p2p', 'group', 'storage') {
819
910
  公网日志应从两台服务器按本轮开始时间分别采集。若仍保存到 `docker-deploy/agentid.pub/latest.log` 和 `docker-deploy/agentid.cn/latest.log`,必须同时记录日志来源是“本地 Docker”还是“公网服务器”;文件名相同不能证明环境。没有远端日志访问权限时,只能给出客户端 E2E 结论,不能声称已完成服务端调用链闭环。
820
911
 
821
912
  ## 隔离双域 federation(dist-aid.com / dist-aid.net)
822
-
913
+
823
914
  ### 准备并启动
824
915
 
825
916
  日常启动只复用 `D:\modelunion\kite\docker-deploy\federation-test\data-dist` 中的固定 CA、服务证书、MySQL 和客户端身份。先做只读材料检查:
@@ -850,16 +941,16 @@ docker compose --env-file ../.env.distributed -f docker-compose.yml ps
850
941
  `setup_certs.py` 会签发或重签 `dist-aid.*` 的 issuer 与服务证书,不属于日常启动命令。只有用户明确同意首次创建或重建该环境时才能执行;固定材料存在时严禁使用 `--force`。
851
942
 
852
943
  上面的日常命令明确排除 `ts-tester` 和 `go-tester`,避免新建 TS Tester 时触发 `npm install`。需要运行 federation TS/Go 用例时只能 `start` 已完成离线依赖准备的容器;容器不存在或缓存不完整就停止测试,不能临时联网补依赖。
853
-
854
- 默认域名和固定身份:
855
-
856
- - 本域:`dist-aid.com`
857
- - 远端:`dist-aid.net`
858
- - Alice:`alice.dist-aid.com`
859
- - Bob:`bobb.dist-aid.net`
860
- - Charlie:`charlie.dist-aid.com`
861
- - Dave:`dave.dist-aid.net`
862
-
944
+
945
+ 默认域名和固定身份:
946
+
947
+ - 本域:`dist-aid.com`
948
+ - 远端:`dist-aid.net`
949
+ - Alice:`alice.dist-aid.com`
950
+ - Bob:`bobb.dist-aid.net`
951
+ - Charlie:`charlie.dist-aid.com`
952
+ - Dave:`dave.dist-aid.net`
953
+
863
954
  ### 基础回归
864
955
 
865
956
  固定 Alice/Bob/Charlie/Dave 身份应直接复用。先确认宿主机 `data-dist/client-data` 中身份目录存在,并确认两个 MySQL 的 `aun_cert.agentid_cert` 中证书序列号与本地证书一致;不一致时停止,不得自动执行 `setup_aids.py`、清理证书表或覆盖身份。
@@ -869,11 +960,11 @@ docker exec main-dist-client-a python /test/federation_ping.py
869
960
  docker exec main-dist-client-a python /test/gateway_to_gateway.py
870
961
  docker exec main-dist-client-a python /test/cross_domain_p2p.py
871
962
  docker exec main-dist-client-a python /test/e2e_plaintext.py
872
- ```
873
-
874
- 按改动范围继续跑主要业务路径:
875
-
876
- ```powershell
963
+ ```
964
+
965
+ 按改动范围继续跑主要业务路径:
966
+
967
+ ```powershell
877
968
  docker exec main-dist-client-a python /test/cross_domain_stream.py
878
969
  docker exec main-dist-client-a python /test/e2e_encrypted.py
879
970
  docker exec main-dist-client-a python /test/e2e_v2_cross_domain.py
@@ -883,14 +974,14 @@ docker exec main-dist-client-a python /test/e2e_storage.py
883
974
  docker exec main-dist-client-a python /test/e2e_group_fs.py
884
975
  docker exec main-dist-client-a python /test/cross_domain_collab.py
885
976
  docker exec main-dist-client-a python /test/cross_domain_service_proxy.py
886
- ```
887
-
888
- 暂不跑:
889
-
890
- - `e2e_mail.py`
891
- - reconnect 相关测试
892
- - `e2e_real.py`、`e2e_comprehensive.py`、`e2e_coverage_gaps.py` 这类仍依赖宿主机 Docker 协调并可能硬编码旧容器名的脚本
893
-
977
+ ```
978
+
979
+ 暂不跑:
980
+
981
+ - `e2e_mail.py`
982
+ - reconnect 相关测试
983
+ - `e2e_real.py`、`e2e_comprehensive.py`、`e2e_coverage_gaps.py` 这类仍依赖宿主机 Docker 协调并可能硬编码旧容器名的脚本
984
+
894
985
  ### TypeScript / Go federation
895
986
 
896
987
  先复用已有 Tester,不得在断网阶段通过 `up` 或 `--force-recreate` 新建:
@@ -905,100 +996,100 @@ docker compose --env-file ../.env.distributed -f docker-compose.yml start ts-tes
905
996
 
906
997
  ```powershell
907
998
  docker exec main-dist-federation-ts-tester bash -lc "cd /workspace/ts && node_modules/.bin/vitest run tests/integration/federation.test.ts tests/integration/federation-storage.test.ts"
908
- ```
909
-
910
- ```powershell
999
+ ```
1000
+
1001
+ ```powershell
911
1002
  docker exec main-dist-federation-go-tester sh -lc "cd /workspace/go && /usr/local/go/bin/go test -tags integration . -run Federation -count=1 -v"
912
- ```
913
-
914
- 如果用临时 Go 容器,需要加入分布式 federation 网络:
915
-
916
- ```powershell
917
- $repo = (Resolve-Path ..\..).Path
1003
+ ```
1004
+
1005
+ 如果用临时 Go 容器,需要加入分布式 federation 网络:
1006
+
1007
+ ```powershell
1008
+ $repo = (Resolve-Path ..\..).Path
918
1009
  docker run --rm --network kite-main-dist-federation_federation-net `
919
1010
  -v "$repo\aun-sdk-core\go:/workspace/go" `
920
1011
  -v kite-main-dist-sdk-testers_dist-go-sdk-mod:/tmp/go-mod:ro `
921
1012
  -e HTTP_PROXY= -e HTTPS_PROXY= -e ALL_PROXY= -e NO_PROXY=* `
922
1013
  -e GOMODCACHE=/tmp/go-mod -e GOPROXY=off -e GOSUMDB=off `
923
1014
  -e AUN_ENV=development -e AUN_VERIFY_SSL=0 `
924
- -e GOCACHE=/workspace/go/.codex_gocache_linux `
925
- -e GOTMPDIR=/workspace/go/.codex_gotmp_linux `
1015
+ -e GOCACHE=/workspace/go/.codex_gocache_linux `
1016
+ -e GOTMPDIR=/workspace/go/.codex_gotmp_linux `
926
1017
  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 Federation -count=1 -v"
927
1018
  ```
928
1019
 
929
1020
  这条临时命令只读挂载 `kite-main-dist-sdk-testers` project 已准备的 module cache;当前 worktree 没有 `go/vendor`,不得改回 `-mod=vendor`。若 named volume 不存在或缺少依赖,`GOPROXY=off` 会直接失败,此时应停止并回到独立依赖准备阶段。
930
-
931
- ## 原有用例兼容验证
932
-
933
- ## Message Python/Go 性能与恢复门禁
934
-
1021
+
1022
+ ## 原有用例兼容验证
1023
+
1024
+ ## Message Python/Go 性能与恢复门禁
1025
+
935
1026
  从当前 worktree 根目录运行串行 A/B。脚本会分别构建独立镜像标签,避免 `latest` 构建缓存污染,并在每个 warmup/measure 阶段前后排空 receiver:
936
-
1027
+
937
1028
  ```powershell
938
1029
  cd D:\modelunion\kite
939
1030
  python docker-deploy/tests/message_performance_gate.py `
940
- --operations 100 --warmup 10 --concurrency 8 `
941
- --timeout 120 --output test-runs/message-performance.json
942
- ```
943
-
944
- 单 receiver 的 push 使用 conflation,push 次数不是消息完整性指标;门禁以 `pull + ack` 验证全部消息到达,并要求最终 receiver 排空。性能镜像分别为 `docker-deploy-kite-message-python-perf:latest` 与 `docker-deploy-kite-message-go-perf:latest`。
945
-
946
- Gateway 模块重启恢复与多 receiver 并发 soak:
947
-
948
- ```powershell
949
- python docker-deploy/tests/message_concurrent_soak_gate.py `
950
- --clients 4 --operations 10 --rounds 1 `
951
- --timeout 60 --max-p99-ms 500 --max-recovery-seconds 30
952
- ```
953
-
954
- 扩大门禁:
955
-
956
- ```powershell
957
- python docker-deploy/tests/message_concurrent_soak_gate.py `
958
- --clients 8 --operations 20 --rounds 2 `
959
- --timeout 120 --max-p99-ms 500 --max-recovery-seconds 30
960
- ```
961
-
962
- soak 脚本会构建 Message-Go、重建 `kite-a`、串行准备 identity、并发发送、逐 receiver `pull + ack + drain`,仅重启 Gateway 模块并要求 Message-Go PID 不变;结束或失败后自动恢复 Python Message 镜像。若 Docker 报残留容器 `No such container`,先执行:
963
-
964
- ```powershell
965
- docker compose --env-file docker-deploy/.env.distributed `
966
- -f docker-deploy/federation-test/docker-compose.yml rm -sf kite-a
967
- ```
968
-
1031
+ --operations 100 --warmup 10 --concurrency 8 `
1032
+ --timeout 120 --output test-runs/message-performance.json
1033
+ ```
1034
+
1035
+ 单 receiver 的 push 使用 conflation,push 次数不是消息完整性指标;门禁以 `pull + ack` 验证全部消息到达,并要求最终 receiver 排空。性能镜像分别为 `docker-deploy-kite-message-python-perf:latest` 与 `docker-deploy-kite-message-go-perf:latest`。
1036
+
1037
+ Gateway 模块重启恢复与多 receiver 并发 soak:
1038
+
1039
+ ```powershell
1040
+ python docker-deploy/tests/message_concurrent_soak_gate.py `
1041
+ --clients 4 --operations 10 --rounds 1 `
1042
+ --timeout 60 --max-p99-ms 500 --max-recovery-seconds 30
1043
+ ```
1044
+
1045
+ 扩大门禁:
1046
+
1047
+ ```powershell
1048
+ python docker-deploy/tests/message_concurrent_soak_gate.py `
1049
+ --clients 8 --operations 20 --rounds 2 `
1050
+ --timeout 120 --max-p99-ms 500 --max-recovery-seconds 30
1051
+ ```
1052
+
1053
+ soak 脚本会构建 Message-Go、重建 `kite-a`、串行准备 identity、并发发送、逐 receiver `pull + ack + drain`,仅重启 Gateway 模块并要求 Message-Go PID 不变;结束或失败后自动恢复 Python Message 镜像。若 Docker 报残留容器 `No such container`,先执行:
1054
+
1055
+ ```powershell
1056
+ docker compose --env-file docker-deploy/.env.distributed `
1057
+ -f docker-deploy/federation-test/docker-compose.yml rm -sf kite-a
1058
+ ```
1059
+
969
1060
  如果目标是证明原来的单实例用例仍可通过,使用当前 worktree 的默认单实例环境:
970
-
971
- ```powershell
1061
+
1062
+ ```powershell
972
1063
  cd D:\modelunion\kite\docker-deploy
973
1064
  docker compose --env-file NUL -f docker-compose.yml up -d
974
- ```
975
-
1065
+ ```
1066
+
976
1067
  这一路径必须继续保持默认单实例值,不使用 `dist-*` 域名,不使用 `data-dist`,也不使用 `kite-dist-*` 容器名。默认单实例测试按主指南执行;双域测试只按本指南的 `dist-aid.*` 环境执行。
977
-
978
- 如果目标是证明“同一批非 reconnect / 非 mail 用例可在分布式控制 master 上通过”,使用本指南的 `dist-agentid.pub` 和临时测试容器命令。
979
-
980
- ## 停止环境
981
-
982
- 三节点分布式:
983
-
984
- ```powershell
1068
+
1069
+ 如果目标是证明“同一批非 reconnect / 非 mail 用例可在分布式控制 master 上通过”,使用本指南的 `dist-agentid.pub` 和临时测试容器命令。
1070
+
1071
+ ## 停止环境
1072
+
1073
+ 三节点分布式:
1074
+
1075
+ ```powershell
985
1076
  cd D:\modelunion\kite\docker-deploy
986
- docker compose --env-file .env.distributed -f docker-compose.distributed.yml down
987
- ```
988
-
989
- 双域 federation:
990
-
991
- ```powershell
1077
+ docker compose --env-file .env.distributed -f docker-compose.distributed.yml down
1078
+ ```
1079
+
1080
+ 双域 federation:
1081
+
1082
+ ```powershell
992
1083
  cd D:\modelunion\kite\docker-deploy\federation-test
993
- docker compose --env-file ../.env.distributed -f docker-compose.yml down
994
- ```
995
-
996
- 不要加 `-v`,除非明确要丢弃本 worktree 的 `data-dist` 运行数据和测试身份。
997
-
998
- ## 故障排查
999
-
1084
+ docker compose --env-file ../.env.distributed -f docker-compose.yml down
1085
+ ```
1086
+
1087
+ 不要加 `-v`,除非明确要丢弃本 worktree 的 `data-dist` 运行数据和测试身份。
1088
+
1089
+ ## 故障排查
1090
+
1000
1091
  - worker 连接控制中心失败:检查 `AUN_CONTROL_BASE_URL` 是否为 `https://aun-console.dist-agentid.pub:19876`,不要写服务 AID `aun_console.dist-agentid.pub`、`127.0.0.1` 或 `localhost`;同时确认 worker 已挂载 `/data/certs/aun-ca-bundle.crt`。
1001
- - SDK discovery 失败:先在测试容器内访问 `https://gateway.dist-agentid.pub/.well-known/aun-gateway`、`https://alice.dist-agentid.pub/.well-known/aun-gateway` 或双域环境的 `https://dist-aid.com/.well-known/aun-gateway`;本地 TLS 校验应由 `AUN_ENV=development`、`AUN_VERIFY_SSL=0` 跳过。
1002
- - URL 返回 loopback:服务端 URL 生成逻辑有问题,应返回 `gateway.{issuer}`、`storage.{issuer}`、`group.{issuer}` 这类 Docker network alias。
1003
- - TLS 报错:本地分布式环境使用自签名材料,确认测试容器内有 `AUN_ENV=development` 和 `AUN_VERIFY_SSL=0`。
1092
+ - SDK discovery 失败:先在测试容器内访问 `https://gateway.dist-agentid.pub/.well-known/aun-gateway`、`https://alice.dist-agentid.pub/.well-known/aun-gateway` 或双域环境的 `https://dist-aid.com/.well-known/aun-gateway`;本地 TLS 校验应由 `AUN_ENV=development`、`AUN_VERIFY_SSL=0` 跳过。
1093
+ - URL 返回 loopback:服务端 URL 生成逻辑有问题,应返回 `gateway.{issuer}`、`storage.{issuer}`、`group.{issuer}` 这类 Docker network alias。
1094
+ - TLS 报错:本地分布式环境使用自签名材料,确认测试容器内有 `AUN_ENV=development` 和 `AUN_VERIFY_SSL=0`。
1004
1095
  - 来源冲突:检查 Compose label 和 bind mount 是否全部位于 `D:\modelunion\kite`;只看 `dist-*` 容器名不足以证明来源。