CONTEXT_COLLAPSE — 上下文折叠
Feature Flag:FEATURE_CONTEXT_COLLAPSE=1子 Feature:FEATURE_HISTORY_SNIP=1实现状态:核心逻辑全部 Stub,布线完整 引用数:CONTEXT_COLLAPSE 20 + HISTORY_SNIP 16 = 36
一、功能概述
CONTEXT_COLLAPSE 让模型内省上下文窗口使用情况,并智能压缩旧消息。当对话接近上下文限制时,自动将旧消息折叠为压缩摘要,保留关键信息的同时释放 token 空间。子 Feature
| Feature | 功能 |
|---|---|
CONTEXT_COLLAPSE | 上下文折叠引擎(后台 LLM 调用压缩旧消息) |
HISTORY_SNIP | SnipTool — 标记消息进行折叠/修剪 |
二、实现架构
2.1 模块状态
| 模块 | 文件 | 状态 |
|---|---|---|
| 折叠核心 | src/services/contextCollapse/index.ts | Stub — 接口完整(ContextCollapseStats、CollapseResult、DrainResult),函数全部空操作 |
| 折叠操作 | src/services/contextCollapse/operations.ts | Stub — projectView 为恒等函数 |
| 折叠持久化 | src/services/contextCollapse/persist.ts | Stub — restoreFromEntries 为空操作 |
| CtxInspectTool | src/tools/CtxInspectTool/ | 缺失 — 目录不存在 |
| SnipTool 提示 | src/tools/SnipTool/prompt.ts | Stub — 空工具名 |
| SnipTool 实现 | src/tools/SnipTool/SnipTool.ts | 缺失 |
| force-snip 命令 | src/commands/force-snip.js | 缺失 |
| 折叠读取搜索 | src/utils/collapseReadSearch.ts | 完整 — Snip 作为静默吸收操作 |
| QueryEngine 集成 | src/QueryEngine.ts | 布线 — 导入并使用 snip 投影 |
| Token 警告 UI | src/components/TokenWarning.tsx | 布线 — 折叠进度标签 |
2.2 核心接口(已定义,待实现)
2.3 预期数据流
2.4 HISTORY_SNIP 子功能
SnipTool 提供手动折叠能力:/force-snip命令 — 强制执行折叠- SnipTool — 标记特定消息进行折叠/修剪
collapseReadSearch.ts已完整实现,将 Snip 作为静默吸收操作处理
2.5 集成点
| 文件 | 位置 | 说明 |
|---|---|---|
src/query.ts | 18,440,616,802,1093,1179 | 溢出检测、413 恢复、折叠应用 |
src/QueryEngine.ts | 124,127,1301 | Snip 投影使用 |
src/utils/analyzeContext.ts | 1122 | 跳过保留缓冲区显示 |
src/utils/sessionRestore.ts | 127,494 | 恢复折叠状态 |
src/services/compact/autoCompact.ts | 179,215 | 自动压缩时考虑折叠 |
三、需要补全的内容
| 优先级 | 模块 | 工作量 | 说明 |
|---|---|---|---|
| 1 | services/contextCollapse/index.ts | 大 | 折叠状态机、LLM 调用、消息压缩 |
| 2 | services/contextCollapse/operations.ts | 中 | projectView() 消息过滤 |
| 3 | services/contextCollapse/persist.ts | 小 | restoreFromEntries() 磁盘持久化 |
| 4 | tools/CtxInspectTool/ | 中 | 上下文内省工具(token 计数、已折叠范围) |
| 5 | tools/SnipTool/SnipTool.ts | 中 | Snip 工具实现 |
| 6 | commands/force-snip.js | 小 | /force-snip 命令 |
四、关键设计决策
- 后台 LLM 压缩:折叠不是简单截断,而是用 LLM 生成压缩摘要保留关键信息
- 413 恢复:当 API 返回 413(请求过大)时,紧急折叠是最重要的恢复手段
- 与 autoCompact 协作:折叠和自动压缩(compact)是不同的机制,折叠在消息级别,压缩在对话级别
- 持久化:折叠状态持久化到磁盘,会话恢复时重载
五、使用方式
六、文件索引
| 文件 | 职责 |
|---|---|
src/services/contextCollapse/index.ts | 折叠核心(stub,接口已定义) |
src/services/contextCollapse/operations.ts | 投影操作(stub) |
src/services/contextCollapse/persist.ts | 持久化(stub) |
src/utils/collapseReadSearch.ts | Snip 吸收操作(完整) |
src/query.ts | 溢出检测和 413 恢复集成 |
src/QueryEngine.ts | Snip 投影使用 |
src/components/TokenWarning.tsx | 折叠进度 UI |