Files
qiming/qimingclaw/crates/agent-electron-client/docs/optimization/SESSION-REUSE-FIX-2026-03-24.md

70 lines
2.1 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.
# Session Reuse Fix - 2026-03-24
## Problem
连续会话(同一个 project每次消息都需要重新创建 engine导致约 3-7 秒的额外延迟。
## Root Cause
`detectConfigChange` 比较环境变量时,`OPENCODE_LOG_DIR` 的值不一致:
- `engineConfigs` 存储的是**本地化后的路径**: `/Users/apple/.qimingclaw/logs`
- `resolvedEnv` 来自请求,包含**容器路径**: `/app/container-logs`
即使两个路径在功能上等价(容器路径会被本地化),字符串比较仍然返回不同,导致 `envChanged: true`,触发 engine 重建。
## Solution
`detectConfigChange` 方法中添加与 `ensureEngineForRequest` 相同的本地化逻辑:
```typescript
// unifiedAgent.ts lines 927-938
let normalizedResolvedEnv = resolvedEnv;
if (
resolvedEnv?.OPENCODE_LOG_DIR &&
!fs.existsSync(resolvedEnv.OPENCODE_LOG_DIR)
) {
normalizedResolvedEnv = {
...resolvedEnv,
OPENCODE_LOG_DIR: path.join(os.homedir(), APP_DATA_DIR_NAME, "logs"),
};
}
```
然后用 `normalizedResolvedEnv` 进行比较,而非原始的 `resolvedEnv`
## Performance Impact
### Before Fix
| Request | Engine Time | Path |
|---------|-------------|------|
| 1st | 3797ms | fullPath (create) |
| 2nd | 3063ms | fullPath (recreate - config changed) |
| 3rd | 6028ms | fullPath (recreate - config changed) |
### After Fix
| Request | Engine Time | Path |
|---------|-------------|------|
| 1st | 2894ms | fullPath (create) |
| 2nd | 5ms | fastPath (reuse) |
| 3rd+ | ~5ms | fastPath (reuse) |
**Improvement**: 连续消息的 engine 准备时间从 3-7 秒降至 ~5ms99%+ 减少)
## Files Changed
- `src/main/services/engines/unifiedAgent.ts`: 添加 `OPENCODE_LOG_DIR` 本地化到 `detectConfigChange` 方法
## Test Verification
1. 发送第一条消息到新 project → 观察 `engine.getOrCreate: ~3000ms`
2. 发送第二条消息到同一 project → 观察 `engine.ensure: ~5ms`
3. 日志应显示 `detectConfigChange: unchanged` 或无 CHANGED 日志
## Related
- `ensureEngineForRequest` 中的本地化逻辑 (lines 777-787)
- `detectConfigChange` 方法 (lines 912-1030)