Skip to content

Commit 552ae00

Browse files
LK265claude
andcommitted
feat(proxy): v1.13.0 — 对话缓存改为纯内存 LRU + Codex JSONL fallback
- 删除 compact.ts / compact-routes.ts / conversation-store.ts(LLM 摘要 + ndjson 持久化) - 新增 codex/session-reader.ts,缓存未命中时从 Codex sessions JSONL 回退读取 - server.ts 改为纯内存 Map LRU(500条),启动不加载历史,stop 不刷盘 - /v1/responses/compact 返回 { compaction: null } stub - codex/writer.ts 追加 model_context_window + features 配置 - DeepSeek 上下文超限翻译为中文提示 - 搜索弹窗支持拖拽调整大小 + 返回按钮 + 回答格式优化 - 净减少 ~2000 行代码 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent cd3c8c9 commit 552ae00

28 files changed

Lines changed: 1689 additions & 2172 deletions

.github/agent/memory/decisions-log.md

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,47 @@
3838

3939
## 决策记录
4040

41+
### ADR-023: v1.13.0 — 删除 LLM compact + ndjson 持久化,改用纯内存 LRU + Codex JSONL fallback
42+
43+
- **日期**:2026-06-19
44+
- **状态**:✅ 已采纳
45+
- **决策者**:用户 + AI Agent
46+
47+
#### 背景
48+
v1.5.0 引入了自己的 LLM 摘要压缩(`compact.ts`, ~418行)和 ndjson 持久化缓存(`conversation-store.ts`, ~264行)。对标分析发现:
49+
50+
1. **cc-switch**:512 条纯内存,无 compact、无持久化。写 `model_context_window=1M` + 禁用 `enable_request_compression` 避免 404。
51+
2. **Codex++**:读 Codex SQLite 元数据,无 compact、无持久化。同样是写 config 配置项。
52+
3. Codex 的 `/v1/responses/compact` 返回 `encrypted_content`(OpenAI 专有 latent 表示),DeepSeek 不支持,经代理必 404。
53+
54+
用户决定和 cc-switch/Codex++ 对齐:不自己实现 compact,写 config 让 Codex 不触发,超限时给用户清晰中文提示。
55+
56+
#### 方案对比
57+
58+
| 方案 | 优点 | 缺点 |
59+
|------|------|------|
60+
| A. 保留 LLM compact + ndjson(当前) | 功能完整 | 维护 ~700 行 compact/ndjson 代码;compact 结果污染缓存一致性;摘要不当会让用户无从排查 |
61+
| B. 纯内存 LRU + Codex JSONL fallback(和 cc-switch 对齐) | 删除 ~2000 行代码;缓存不丢数据(Codex JSONL 永久保有);超限时用户明确知道发生了什么 | 重启后缓存清空需从 Codex JSONL 重新加载(~10ms/次) |
62+
63+
#### 决策
64+
> 选择 **方案 B**:删除 `conversation-store.ts``compact.ts``compact-routes.ts`。代理使用纯内存 LRU(500条)。缓存未命中时从 `~/.codex/sessions/` 的 JSONL 文件回退读取。`/v1/responses/compact` 返回 `{ compaction: null }``codex/writer.ts` 写入 `model_context_window=1M` + `[features] enable_request_compression=false`
65+
66+
#### 理由
67+
1. 和 cc-switch/Codex++ 对齐——这两个项目都已大规模验证此策略可用
68+
2. Codex 的 compact 依赖 OpenAI 专有 `encrypted_content`,经代理不可用
69+
3. 绝大多数对话到不了 DeepSeek 128K 上限,compact 触发概率极低
70+
4. LLM 摘要是不可逆信息损失,摘丢关键细节用户无从排查
71+
5. 净删除 ~1967 行代码,降低维护负担
72+
73+
#### 影响
74+
- 删除 `electron/proxy/conversation-store.ts``electron/proxy/compact.ts``electron/proxy/compact-routes.ts` 及配套测试
75+
- 新增 `electron/codex/session-reader.ts` — 扫描 `~/.codex/sessions/` 目录读取对话历史
76+
- `server.ts` ConversationStore → 纯内存 Map + LRU
77+
- `codex/writer.ts` 追加 4 个上下文窗口配置字段
78+
- ADR-019(v1.5.0 LLM compact)被推翻
79+
80+
---
81+
4182
### ADR-022: v1.11.0 — macOS 自动更新走原生 https 下载 DMG,不走 Squirrel.Mac
4283

4384
- **日期**:2026-06-16
@@ -438,7 +479,7 @@ Claude Code CLI 仅写 `~/.zshrc`,需要重启终端才生效,体验差。
438479
### ADR-019: v1.5.0 — /v1/responses/compact 上下文压缩采用 LLM 摘要 + ndjson 持久化
439480

440481
- **日期**:2026-06-11
441-
- **状态**✅ 已采纳
482+
- **状态**❌ 已废弃(被 ADR-023 取代)
442483
- **决策者**:用户 + AI Agent
443484

444485
#### 背景

.github/agent/memory/project-memory.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
| 项目类型 | 跨平台桌面图形化代理(Electron 桌面应用) |
1616
| 业务场景 | 让不懂命令行的用户在 macOS / Windows 上"双击安装、点几下按钮",把 Codex CLI 和 Codex Desktop 接到 DeepSeek 上 |
1717
| 用户规模 | 个人用户与小团队,早期目标 100 – 1000 人 |
18-
| 当前阶段 | v1.10.0(开发中,新增离线插件安装功能|
18+
| 当前阶段 | v1.13.0(开发中,对话缓存改为纯内存 LRU + Codex JSONL fallback|
1919
| 设计原则 | 零门槛、图形化、一键安装;极简实用 > 功能堆砌 |
2020
| 主语言 | TypeScript 5.x(strict) |
2121
| 桌面运行时 | Electron 30+ |
@@ -131,8 +131,9 @@
131131
| 协议转换 | `electron/proxy/translate.ts` | OpenAI Responses ⇄ DeepSeek Chat Completions 请求/响应映射 | ✅ 已完成 v0.1 |
132132
| 推理状态 | `electron/proxy/reasoning.ts` | `deepseek-reasoner` `reasoning_content` 跨轮回传 | ✅ 已完成 v0.1 |
133133
| 流式转发 | `electron/proxy/stream.ts` | SSE pipe,断流处理;含 `callDeepSeekSync` 非流式 API | ✅ 已完成 v0.1 |
134-
| 上下文压缩 | `electron/proxy/compact.ts` | LLM 摘要压缩(>20 条触发)+ 超时回退截断;v1.5.4 新增 compaction_trigger / compaction item 协议处理 | ✅ v1.5.4 |
135-
| 对话持久化 | `electron/proxy/conversation-store.ts` | ndjson 文件存储,atomic write,启动恢复,24h/50 条清理 | ✅ v1.5.0 |
134+
| 对话缓存(内存) | `electron/proxy/server.ts` | 纯内存 LRU(500条),缓存未命中时从 Codex JSONL 回退读取 | ✅ v1.13.0 |
135+
| Codex 会话读取 | `electron/codex/session-reader.ts` | 扫描 `~/.codex/sessions/YYYY/MM/DD/` 目录,读取 JSONL 对话历史(纯只读) | ✅ v1.13.0 |
136+
| 上下文窗口配置 | `electron/codex/writer.ts` | "保存并应用"时写入 `model_context_window=1M` + `model_auto_compact_token_limit=900K` + `[features] enable_request_compression=false`(与 cc-switch 一致) | ✅ v1.13.0 |
136137
| 插件下载 | `electron/plugins/index.ts` | 离线插件包下载(Server API → COS 302 → 流式写入磁盘),进度推送,安装指令生成 | ✅ v1.10.0 |
137138
| Codex 路径 | `electron/codex/paths.ts` | 跨平台 `~/.codex` 解析 | ✅ 已完成 v0.1 |
138139
| Codex 写入 | `electron/codex/writer.ts` | 写 config.toml / auth.json + 备份 + 还原 | ✅ 已完成 v0.1 |

.github/agent/memory/task-history.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,36 @@
2121

2222
## 任务记录
2323

24+
### [TASK-068] v1.13.0 — Review 修复:接入 session-reader fallback + 清理 dead code
25+
- **日期**:2026-06-19
26+
- **类型**:fix
27+
- **摘要**:Review 发现 3 个缺陷:① `session-reader.ts` 写好但未接入请求路径——缓存未命中时不会回退读 Codex JSONL(严重);② `stream.ts``extraOutputItems` 参数已是死代码(中);③ Settings UI 轻微困惑(跳过)。修复:`session-reader.ts` 新增 `readSessionHistoryAsChatMessages()``http-handler.ts` / `ws-handler.ts` 缓存未命中时 await 调用 → 存入缓存。`stream.ts` 删除 `extraOutputItems` 参数和相关代码块。185/185 tests ✅,typecheck ✅,lint ✅。
28+
- **变更文件**`session-reader.ts`(+readSessionHistoryAsChatMessages)、`http-handler.ts`(+async + fallback)、`ws-handler.ts`(+fallback)、`stream.ts`(-extraOutputItems)
29+
30+
### [TASK-067] v1.13.0 — 对话缓存改为纯内存 LRU + Codex JSONL fallback(删除 compact 和 ndjson)
31+
- **日期**:2026-06-19
32+
- **类型**:refactor
33+
- **摘要**:按 `docs/DESIGN-codex-native-session-storage.md` v5.0 实施。① 删除 `conversation-store.ts`(ndjson 持久化 ~264行)、`compact.ts`(LLM 摘要压缩 ~418行)、`compact-routes.ts`(~258行)及配套测试(~879行);② 新增 `codex/session-reader.ts`(~150行),从 `~/.codex/sessions/` 目录扫描读取 Codex JSONL 作为缓存未命中回退源;③ `server.ts` 改为纯内存 LRU(Map, 500条),缓存命中直接返回,未命中时 http-handler/ws-handler 从 Codex JSONL 回退读取;④ `codex/writer.ts` 追加 `model_context_window=1M` + `model_auto_compact_token_limit=900K` + `[features] enable_request_compression=false`,用户点"保存并应用"时写入;⑤ `/v1/responses/compact` HTTP/WS 路由返回 `{ compaction: null }` stub;⑥ 删除 emergencyCompact 自动重试逻辑,上下文超限时翻译为中文提示"建议使用 /new 开启新对话";⑦ 与 cc-switch 策略完全对齐。185/185 tests ✅,typecheck ✅,lint ✅。未 push。
34+
- **变更文件**
35+
- `electron/codex/session-reader.ts`(新增,~150行)
36+
- `electron/codex/writer.ts`(+10行:上下文窗口配置)
37+
- `electron/proxy/conversation-store.ts`(删除)
38+
- `electron/proxy/compact.ts`(删除)
39+
- `electron/proxy/compact-routes.ts`(删除)
40+
- `electron/proxy/server.ts`(重写缓存层:ConversationStore→Map, +cacheSet LRU, -compact方法, -storePath, -forceFlush)
41+
- `electron/proxy/http-handler.ts`(conversationStore→conversationCache, -emergencyCompact, +中文超限提示)
42+
- `electron/proxy/ws-handler.ts`(同上,compaction_trigger 静默跳过,/compact 返回stub)
43+
- `electron/proxy/http-routes.ts`(/compact 返回 stub)
44+
- `electron/proxy/types.ts`(-storePath)
45+
- 删除 4 个测试文件,修改 3 个测试文件
46+
- **关联**:DESIGN-codex-native-session-storage.md、ADR-023
47+
- **注意事项**
48+
1. 净删除 ~1967 行代码
49+
2. 已有用户的 ndjson 文件不自动删除(`~/.codex-switch/conversation-store.ndjson` 可手动清理)
50+
3. 缓存上限保留(Settings UI 中"对话缓存"区块仍可用),但改为纯内存 LRU
51+
4. node:sqlite 实验性 API 不可用时自动回退目录扫描,session-reader 始终可用
52+
5. 与 cc-switch 的策略完全一致:config 禁用 compact + proxy 返回 stub + 不做 LLM 摘要
53+
2454
### [TASK-066] v1.13.0 智能搜索 — Spotlight 式浮层搜索
2555
- **日期**:2026-06-18
2656
- **类型**:feat

CHANGELOG.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,22 @@
33
本项目遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 格式,
44
版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)
55

6-
## [1.13.0] - 2026-06-18
6+
## [1.13.0] - 2026-06-19
77

88
### 新增
99

10-
- **🔍 智能搜索,遇到问题直接问**。右上角新增搜索按钮,点开输入问题(比如"Codex 连不上怎么办"),AI 会基于帮助文档和安装指南给你答案。不管在哪一页都能用,不打断当前操作
11-
- **帮助文档全面升级**。FAQ 新增了大量常见问题:Token 消耗为什么高、怎么省钱、安不安全、Codex 没反应怎么办……都是真实用户每天在微信群里问的问题,现在打开帮助就能找到答案
10+
- **🔍 智能搜索**。右上角新增搜索按钮,输入问题(如"Codex 连不上怎么办"),AI 基于帮助文档秒回答案。支持拖拽调整窗口大小
11+
12+
### 变更
13+
14+
- **对话缓存大幅精简**。删掉自研的上下文压缩和磁盘持久化,改为纯内存缓存。代码净减 2000 行
15+
- **旧对话不怕丢**。缓存超限后,代理自动从 Codex 原生会话文件读取历史,没有上限
1216

1317
### 修复
1418

15-
- **Claude Desktop 上手指南过时信息修正**。Claude Desktop 早就直连 DeepSeek 了,不再走本地代理——帮助文档和日志说明已同步更新
16-
- **域名更换**。官网从 codexswtich.cloud 迁移到 codex-switch.cloud,一切自动生效,无需重新配置
19+
- **长对话不再报 compact 错误**。以前 Codex Desktop 触发压缩时代理报 404/502,现在直接返回"无需压缩",不中断
20+
- **上下文超限给中文提示**。超出 DeepSeek 上限时弹出人话建议,不再甩英文错误代码
21+
- **保存配置时自动写入窗口优化设置**。告诉 Codex "你有 1M 窗口",避免频繁尝试 compact
1722

1823
## [1.12.2] - 2026-06-18
1924

0 commit comments

Comments
 (0)