2.1 KiB
2.1 KiB
Session Reuse Fix - 2026-03-24
Problem
连续会话(同一个 project)每次消息都需要重新创建 engine,导致约 3-7 秒的额外延迟。
Root Cause
detectConfigChange 比较环境变量时,OPENCODE_LOG_DIR 的值不一致:
engineConfigs存储的是本地化后的路径:/Users/apple/.qimingclaw/logsresolvedEnv来自请求,包含容器路径:/app/container-logs
即使两个路径在功能上等价(容器路径会被本地化),字符串比较仍然返回不同,导致 envChanged: true,触发 engine 重建。
Solution
在 detectConfigChange 方法中添加与 ensureEngineForRequest 相同的本地化逻辑:
// 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 秒降至 ~5ms(99%+ 减少)
Files Changed
src/main/services/engines/unifiedAgent.ts: 添加OPENCODE_LOG_DIR本地化到detectConfigChange方法
Test Verification
- 发送第一条消息到新 project → 观察
engine.getOrCreate: ~3000ms - 发送第二条消息到同一 project → 观察
engine.ensure: ~5ms - 日志应显示
detectConfigChange: unchanged或无 CHANGED 日志
Related
ensureEngineForRequest中的本地化逻辑 (lines 777-787)detectConfigChange方法 (lines 912-1030)