Files
zn-ai/docs/ClawX-Gateway-Launcher-Migration-Execution-Plan.md
DEV_DSW 71bcc3b3c5 feat: implement telemetry system for application usage tracking
- Added telemetry utility to capture application events and metrics.
- Integrated PostHog for event tracking with distinct user identification.
- Implemented telemetry initialization, event capturing, and shutdown procedures.

feat: add UV environment setup for Python management

- Created utilities to manage Python installation and configuration.
- Implemented network optimization checks for Python installation mirrors.
- Added functions to set up managed Python environments with error handling.

feat: enhance host API communication with token management

- Introduced host API token retrieval and management for secure requests.
- Updated host API fetch functions to include token in headers.
- Added support for creating event sources with authentication.

test: add comprehensive tests for gateway protocol and startup helpers

- Implemented unit tests for gateway protocol helpers, event dispatching, and state management.
- Added tests for startup recovery strategies and process policies.
- Ensured coverage for connection monitoring and restart governance logic.
2026-04-23 17:21:57 +08:00

510 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ClawX Gateway Launcher 迁移执行文档
## 1. 目标
`zn-ai` 当前已经完成 Gateway 启动链第一波迁移,解决重点是:
- launch context 组装
- launcher core 与 Windows 启动兼容
- startup orchestrator
- startup stderr 诊断
- supervisor 的基础端口与孤儿进程治理
下一波只继续迁移 `ClawX` 的 Gateway 生命周期与自愈闭环,范围严格限制在以下 4 组能力:
- `connection-monitor`
- `restart-controller` / `restart-governor`
- `reload-policy`
- `doctor repair`
本轮明确不做:
- Chat 主链路改造
- Skills 安装链路改造
- Providers/Channels 非 Gateway 生命周期相关重构
- UI 视觉层修改
## 2. 当前结论
`zn-ai``ClawX` 在 Gateway 启动能力上已经接近,但在 Gateway 完整生命周期能力上仍不一致。
`zn-ai` 已具备:
- `prepareGatewayLaunchContext(...)`
- `launchGatewayProcess(...)`
- `runGatewayStartupSequence(...)`
- startup stderr 分类与缓存
- `waitForPortFree(...)`
- 孤儿监听进程探测与清理
- Windows `node-runtime` 启动策略
`zn-ai` 仍缺少:
- 心跳监控与健康检查驱动的自愈
- 启动中/重连中的 restart defer 机制
- restart cooldown governor
- Gateway reload policy 解析与应用
- OpenClaw doctor repair
- Python readiness warmup
- 与这些能力配套的 manager 生命周期接线
## 3. 第二波迁移目标
迁移完成后,`zn-ai` 的 Gateway 至少要补齐下面这组行为:
1. Gateway 连接建立后有稳定的 ping/pong 与 message heartbeat 监控。
2. 连接失活或健康检查失败时manager 能按治理策略自愈,而不是单次掉线后长期停摆。
3. 外部触发的 restart 请求在 `starting` / `reconnecting` 阶段不会打断在途启动,而是 defer 到合适时机。
4. 连续 restart 受到 cooldown governor 约束,避免抖动和端口争抢。
5. Gateway reload policy 能从 `~/.openclaw/openclaw.json` 读取,并决定走 `reload``restart``hybrid``off`
6. startup-orchestrator 在判定配置损坏时能触发 doctor repair然后再试一次启动。
7. Windows 下真实 Gateway 冒烟时,能区分:
- 启动慢但最终 ready
- 配置损坏后 repair 成功
- repair 失败后停止重试
## 4. 建议 sub-agent 数量
建议 `4` 个开发 sub-agent`1` 个主协调 agent。
理由:
- 这 4 组能力的依赖闭包并不完全独立。
- `manager.ts` 是热点文件,不能让多个 worker 同时改。
- `doctor repair` 会额外牵动 `supervisor.ts` 与若干工具模块,适合单独收口。
- 测试与真实回归要独立 ownership避免实现者自己绕过风险。
不建议拆成超过 `4` 个开发 sub-agent因为
- `manager.ts``startup-orchestrator.ts``supervisor.ts` 的写入冲突会明显增加。
- 这轮目标是生命周期闭环,不是大范围模块化重构。
## 5. 分工方案
### 主协调 Agent
职责:
- 冻结第二波迁移边界,只做 Gateway 生命周期与自愈能力。
- 冻结共享契约:
- lifecycle state
- reconnect / deferred restart policy
- reload policy result
- doctor repair hook
- 负责合并顺序、冲突协调、回归 checklist 与最终收口。
不直接负责大规模代码写入,重点是接口与顺序控制。
### SA-1 Lifecycle Primitives
责任范围:
- `zn-ai/electron/gateway/connection-monitor.ts`
- `zn-ai/electron/gateway/process-policy.ts`
- `zn-ai/electron/gateway/lifecycle-controller.ts`
- `zn-ai/electron/gateway/restart-controller.ts`
- `zn-ai/electron/gateway/restart-governor.ts`
- 如有必要,可补最小 `state` 辅助文件,但不负责 manager 接线
目标:
- 迁入 ClawX 的心跳监控、健康检查定时器、restart defer 规则、reconnect 规则、restart cooldown 规则
- 保持实现尽量独立,供 manager 后续接入
约束:
- 不修改 `manager.ts`
- 不修改 UI / API / Chat / Skills
### SA-2 Repair & Supervisor
责任范围:
- `zn-ai/electron/gateway/supervisor.ts`
- `zn-ai/electron/gateway/startup-orchestrator.ts`
- 如缺失则新增最小工具:
- `zn-ai/electron/utils/uv-env.ts`
- `zn-ai/electron/utils/uv-setup.ts`
- `zn-ai/electron/utils/env-path.ts`
目标:
- 迁入 `warmupManagedPythonReadiness()`
- 迁入 `runOpenClawDoctorRepair()`
- 把 doctor repair 接进 `runGatewayStartupSequence(...)`
- 保持对 Windows 的 process tree terminate 和 PATH 注入兼容
约束:
- 不改 `manager.ts`
- 只为 doctor repair 引入最小依赖,不顺手扩散到其它 Python/uv 功能
### SA-3 Manager Lifecycle Integration
责任范围:
- `zn-ai/electron/gateway/manager.ts`
- 必要时小幅修改:
- `zn-ai/electron/gateway/ws-client.ts`
- `zn-ai/electron/gateway/types.ts`
目标:
- 接入 SA-1 输出的 lifecycle / reconnect / restart governance
- 接入 SA-2 输出的 doctor repair 与 startup recovery hook
-`zn-ai` 补齐:
- `startHealthCheck()`
- `startPing()`
- `scheduleReconnect()`
- `debouncedRestart()`
- `reload()`
- `debouncedReload()`
- reload policy refresh
约束:
- 只动 Gateway 生命周期相关逻辑
- 不改现有 chat payload 结构
- 不借机重构无关的 runtime broadcast
说明:
`manager.ts` 由 SA-3 单独 owning其他 sub-agent 不直接修改这个文件,避免冲突。
### SA-4 Verification & Regression
责任范围:
- `zn-ai/tests/*gateway*`
- Gateway 相关 smoke 脚本与文档
- 必要时补最小测试夹具
目标:
- 给新增的 lifecycle/reload/repair 行为补单测
- 补真实 Windows 冒烟步骤
- 输出失败定位矩阵,覆盖:
- heartbeat miss
- deferred restart
- governor suppress
- reload policy mode 分支
- doctor repair success/failure
约束:
- 不修改产品功能逻辑,除非为了让测试可注入而做最小 seam
## 6. 实施顺序
### Wave 2A
并行推进:
- SA-1 Lifecycle Primitives
- SA-2 Repair & Supervisor
冻结输出契约:
- `GatewayConnectionMonitor`
- `GatewayRestartController`
- `GatewayRestartGovernor`
- `GatewayReloadPolicy`
- `runOpenClawDoctorRepair()`
- `warmupManagedPythonReadiness()`
### Wave 2B
在 Wave 2A 契约冻结后推进:
- SA-3 Manager Lifecycle Integration
这一步只做接线和行为收口,不反向改 SA-1/SA-2 的模块边界。
### Wave 2C
最后推进:
- SA-4 Verification & Regression
- 主协调 Agent 汇总验收
## 7. 合并顺序
1. `process-policy.ts` / `lifecycle-controller.ts` / `connection-monitor.ts`
2. `restart-controller.ts` / `restart-governor.ts`
3. `reload-policy.ts`
4. `supervisor.ts` 的 doctor repair 与 Python warmup
5. `startup-orchestrator.ts` repair hook
6. `manager.ts` 生命周期接线
7. tests / smoke / 文档收口
## 8. 关键依赖与注意事项
### 8.1 manager.ts 是单点热点
本轮很多能力最终都要落到 `manager.ts`。因此:
- 只有 SA-3 可以写 `manager.ts`
- SA-1 / SA-2 只提供可接入模块和稳定接口
### 8.2 doctor repair 不是孤立功能
`ClawX` 的 doctor repair 依赖:
- OpenClaw entry/runtime path
- bundled `bin` PATH 注入
- `uv` 镜像环境
- Python readiness 检查
`zn-ai` 当前还没有完整对应模块,所以必须按“最小依赖闭包”迁入,不能只拷贝 `runOpenClawDoctorRepair()`
### 8.3 reload policy 只做 Gateway 进程策略
本轮 `reload-policy` 只决定 Gateway 进程层行为:
- `off`
- `reload`
- `restart`
- `hybrid`
不扩展到 UI 或配置编辑器逻辑。
### 8.4 Windows 冒烟必须保留长等待预算
之前真实诊断已经确认 Windows 下 OpenClaw ready 可能超过 100 秒,因此:
- 不得把 ready wait 预算收回到旧值
- 冒烟时要区分“慢启动”与“真失败”
## 9. 验收标准
必须覆盖以下场景:
- Gateway 连接后能持续 ping/pong并在 message/pong 到达时恢复 heartbeat 状态
- heartbeat 连续 miss 达阈值后能触发受控恢复
- `restart()``starting` / `reconnecting` 阶段会 defer而不是打断在途启动
- restart governor 在 cooldown 内能 suppress 重复 restart
- `reload-policy` 可从 `~/.openclaw/openclaw.json` 读取并应用
- `reload()` 失败时能 fallback 到 `restart()`
- startup 检测到配置损坏时能执行 doctor repair
- doctor repair 成功后Gateway 能继续启动
- doctor repair 失败后,错误信息可诊断,不会无限重试
- Windows 真实启动回归中,不再频繁出现无诊断信息的 `exited before becoming ready`
建议最少验证:
- `pnpm typecheck`
- Gateway 生命周期相关单测
- 一次 Windows 本机真实 Gateway 冒烟
- 一次配置损坏后的 repair 回归
## 10. 当前执行状态
当前建议按以下顺序继续推进:
1. 先完成 Wave 2 的 sub-agent 分工与 ownership 冻结
2. 并行实施 SA-1 与 SA-2
3. 由 SA-3 独占接入 `manager.ts`
4. 最后由 SA-4 负责真实回归与失败矩阵
## 11. 第三波补齐范围
`Wave 2A / 2B` 完成之后,`zn-ai``ClawX` 的 Gateway 差距主要收敛到下面这一组:
- `state.ts`
- `protocol.ts`
- `event-dispatch.ts`
- `manager.ts` 里的 diagnostics
- `manager.ts` 里的 `gatewayReady fallback`
这组能力的目标不是继续扩展生命周期治理,而是把 Gateway 的“状态模型、协议兼容、事件分发、诊断可观测性”补到接近 `ClawX`
本轮明确不做:
- Chat 业务语义改造
- UI 新增诊断页
- telemetry 上传体系迁移
- 与本轮无关的 Skills / Channels / Providers 重构
## 12. 第三波建议 sub-agent 数量
最小可行配置是 `3` 个开发 sub-agent`1` 个主协调 agent。
推荐配置是 `4` 个开发 sub-agent`1` 个主协调 agent。
推荐按 `4` 个开发 sub-agent 推进,原因是:
- `manager.ts` 仍然是单点热点文件,必须单 owner。
- `protocol.ts` / `event-dispatch.ts``state.ts` / diagnostics 的依赖闭包并不相同,适合并行推进。
- diagnostics / `gatewayReady fallback` 需要独立验证,不适合完全由实现者自测。
如果资源受限,也可以退化成 `3` 个开发 sub-agent
- 把验证工作并回主协调 Agent
- 或把 `protocol/event-dispatch``state/diagnostics primitives` 合并给同一个 sub-agent
## 13. 第三波分工方案
### 主协调 Agent
职责:
- 冻结第三波范围,只做状态层、协议层、事件分发层和 manager diagnostics/fallback。
- 冻结共享契约:
- GatewayStatus 状态结构
- diagnostics snapshot 结构
- protocol / notification 类型守卫
- `gateway.ready` fallback 行为
- 负责合并顺序、冲突协调和最终验收。
### SA-1 Protocol & Dispatch
责任范围:
- `zn-ai/electron/gateway/protocol.ts`
- `zn-ai/electron/gateway/event-dispatch.ts`
- 必要时小幅修改:
- `zn-ai/electron/gateway/types.ts`
目标:
- 迁入 `ClawX` 的 JSON-RPC type guards 与 protocol 类型定义
- 迁入 protocol event 与 JSON-RPC notification 分发逻辑
-`zn-ai` 的 Gateway manager 不再只处理当前 OpenClaw event frame而是具备和 `ClawX` 接近的 protocol fallback 面
约束:
- 不修改 `manager.ts`
- 不修改 Chat store / renderer 事件消费逻辑
### SA-2 State & Diagnostics Primitives
责任范围:
- `zn-ai/electron/gateway/state.ts`
- `zn-ai/electron/gateway/diagnostics.ts`
- 如有必要,可补最小 diagnostics 类型文件
目标:
- 迁入 `GatewayStateController`
- 定义 `getStatus()` / `isConnected()` / state transition hook 的统一实现
- 为 manager diagnostics 提供稳定数据结构:
- `lastAliveAt`
- `lastRpcSuccessAt`
- `lastRpcFailureAt`
- `lastRpcFailureMethod`
- `lastHeartbeatTimeoutAt`
- `lastSocketCloseAt`
- `lastSocketCloseCode`
- `consecutiveHeartbeatMisses`
- `consecutiveRpcFailures`
约束:
- 不修改 `manager.ts`
- 不新增 UI 诊断入口
### SA-3 Manager State & Protocol Integration
责任范围:
- `zn-ai/electron/gateway/manager.ts`
- 必要时小幅修改:
- `zn-ai/electron/gateway/ws-client.ts`
目标:
- 接入 SA-1 的 protocol / event-dispatch
- 接入 SA-2 的 state controller 与 diagnostics snapshot
-`zn-ai` 补齐:
- `getDiagnostics()`
- `gateway.ready` event handling
- `gatewayReady fallback` timer
- richer state transition handling
- RPC success / failure / socket close / heartbeat timeout 记录
约束:
- `manager.ts` 由 SA-3 单独 owning
- 不借机改动 chat payload 结构
- 不迁移 telemetry 上传逻辑,除非成为必需依赖
### SA-4 Verification & Regression
责任范围:
- `zn-ai/tests/*gateway*`
- Gateway 相关 smoke checklist 与文档
目标:
- 给以下能力补测试:
- protocol type guards
- event dispatch mapping
- state transition callbacks
- diagnostics snapshot 更新
- `gateway.ready` fallback 行为
- 补一组回归清单,确认新 protocol fallback 不会破坏现有 `chat:*` 事件链路
约束:
- 不修改产品逻辑,除非为了测试可注入而补最小 seam
## 14. 第三波实施顺序
### Wave 3A
并行推进:
- SA-1 Protocol & Dispatch
- SA-2 State & Diagnostics Primitives
冻结输出契约:
- `protocol.ts`
- `event-dispatch.ts`
- `GatewayStateController`
- diagnostics snapshot 结构
### Wave 3B
在 Wave 3A 契约冻结后推进:
- SA-3 Manager State & Protocol Integration
这一步必须保持 `manager.ts` 单 owner不允许并行写入。
### Wave 3C
最后推进:
- SA-4 Verification & Regression
- 主协调 Agent 汇总验收
## 15. 第三波合并顺序
1. `protocol.ts`
2. `event-dispatch.ts`
3. `state.ts`
4. diagnostics types / helper
5. `manager.ts` 接线
6. tests / smoke / 文档收口
## 16. 第三波验收标准
必须覆盖以下场景:
- `zn-ai` 具备与 `ClawX` 接近的 JSON-RPC request/response/notification type guards
- protocol event 与 JSON-RPC notification 能走统一 dispatch 层
- manager 状态更新不再完全依赖手工分支,而是通过 state controller 收口
- diagnostics 能记录最近 alive/RPC/socket/heartbeat 关键时间点和失败原因
- 收到 `gateway.ready` 时能更新 Gateway ready 状态
- 未收到 `gateway.ready`fallback timer 能在超时后兜底设置 ready
- 现有 `chat:delta` / `chat:final` / `chat:error` / `chat:aborted` 链路不回归
建议最少验证:
- `pnpm typecheck`
- Gateway protocol / diagnostics 相关单测
- 一次真实 Gateway 启动与 `gateway.ready` 兜底回归