v0.41.0 - Context Window Overhaul
Deep Copilot v0.41.0
中文版在下方 / English notes below.
🇨🇳 中文
主题:Context Window 优化套件 · 三个新斜杠命令 · 底部 Context Ring · 会话切换闪屏修复
✨ 新功能 1:上下文窗口管理重构(Issue #142)
长对话越来越容易吃满 token 窗口,0.41.0 把"上下文管理"做成了一套完整的机制:
- 结构感知截断(structure-aware truncation)
- 保留最新工具调用的完整内容
- 较旧的轮次自动折叠为"摘要骨架"(保留语义,丢弃大段冗余)
- 同文件读取去重
- 多次读取同一路径时,只保留最后一次完整内容
- 较早的读取被折叠为占位符:
<file path=... read-collapsed='true'/>
- 滚动摘要(rolling summary)
- 超阈值时按需调用模型,把更早的对话压缩为结构化摘要节点
- 会话历史持久化层(
session-store.js)已适配,重新加载会话能正确回放摘要节点
- MCP per-server opt-out:可以为某个 MCP server 显式关闭上下文压缩参与
- 大文件读取提示:
file-read.js在读取大文件时附带read-large-filehint,引导模型先用 grep 而非整文件读入
✨ 新功能 2:三个新斜杠命令
| 命令 | 说明 |
|---|---|
/compact [focus] |
立即压缩当前会话历史;[focus] 可选,作为摘要方向偏置;会自动合并工作区根目录下的 .deepcopilot/compact.md 或 CLAUDE.md 中的项目级 compact 指令 |
/context |
弹出当前会话的 token 占用细分(system / messages / tools / files / hints) |
/fork [name] |
把当前会话从某一条消息派生为一个新会话,保留该消息之前的全部上下文作为起点 |
✨ 新功能 3:底部 Context Ring 指示器
- 替换原本底栏右下角的状态点(
#foot .dot) - 新的环形进度(
#ft-ctx)实时显示上下文窗口占用百分比 - 颜色按阈值渐变:
<60%绿 →<85%黄 →<100%橙 → 满 红 - 点击环形展开 popover,显示与
/context一致的占用细分 - 数据源:agent-loop 每轮回写的
ctxUsage事件
🐞 修复:会话切换闪屏 / 滚动条抖动(Issue #143)
切走再切回正在运行的会话时,缓冲事件被同步全部重放,每个事件触发一次 requestAnimationFrame 滚动,导致:
- 聊天面板明显闪烁
- 滚动条来回抖动
- 重放期间用户无法稳定阅读
修复手法:
_loadSession用setTimeout(..., 0)把事件重放推到下一个宏任务- 重放序列由
replayStart/replayEnd信封包裹 - Webview 端新增
_replaying标志,在重放期间ascroll()静默 - 重放结束时一次性滚到底部,体验与单条事件流入一致
🛠 内部改动
src/chat/agent-loop.js/src/chat/provider.js:上下文窗口管理主逻辑、ctxUsage事件源src/chat/compact.js:滚动摘要 +/compact实现src/chat/context-refs.js:/contexttoken 细分src/chat/session-store.js:摘要节点的持久化与回放src/tools/file-read.js:大文件 hint 输出src/api/anthropic-client.js/src/api/openai-client.js:客户端小幅清理src/errors.js:错误文案微调media/chat.{css,js}/src/webview/html.js:#ft-ctx环形指示器 + popover;_replaying抑制src/utils/i18n.js:新增上下文管理相关中英双语文案
🔒 安全 / 兼容性
- 不放宽 Webview CSP
- 不引入新运行时依赖(运行时仍仅
@anthropic-ai/sdk/openai/js-tiktoken) - 滚动摘要使用既有 API 通道,无新网络入口
- 所有 token 统计在本地完成,不上送任何额外信息
🇺🇸 English
Theme: Context-window overhaul · three new slash commands · footer context ring · session-switch flash fix
✨ Feature 1 — Context-window overhaul (Issue #142)
Long conversations chew through the token window quickly. 0.41.0 turns "context management" into a real mechanism:
- Structure-aware truncation
- Latest tool results kept verbatim
- Older turns collapse to summary skeletons (semantics preserved, bulk dropped)
- Per-file read dedup
- Multiple reads of the same path keep only the latest payload
- Earlier reads become placeholders:
<file path=... read-collapsed='true'/>
- Rolling summary fallback
- When thresholds are crossed, the model is invoked on-demand to compress older history into structured summary nodes
session-store.jspersists & replays these nodes correctly when sessions are reloaded
- MCP per-server opt-out: any MCP server can explicitly opt out of compaction
- Large-file read hint:
file-read.jsnow ships aread-large-filehint nudging the model to grep first instead of slurping the whole file
✨ Feature 2 — Three new slash commands
| Command | Behaviour |
|---|---|
/compact [focus] |
Force-compacts the active session; optional focus biases the summarisation; merges project-level instructions from .deepcopilot/compact.md or CLAUDE.md in the workspace root |
/context |
Opens a breakdown popover (system / messages / tools / files / hints) of the current token spend |
/fork [name] |
Forks the current session from a chosen message into a brand-new session, with that message as the new origin |
✨ Feature 3 — Footer context ring
- Replaces the legacy footer status dot (
#foot .dot) - The new ring indicator (
#ft-ctx) shows live context-window usage - Colour ramps green → yellow → orange → red across the 60% / 85% / 100% thresholds
- Click to open the same breakdown popover used by
/context - Data source: the
ctxUsageevent written by the agent loop after every round
🐞 Fix — Session-switch flash / scrollbar jitter (Issue #143)
Switching away from and back to a running session previously replayed every buffered event in a tight loop, each one scheduling its own RAF scroll-to-bottom. Symptoms:
- Visible flash in the chat panel
- Scrollbar oscillating up/down
- Unreadable during the replay burst
Fix:
_loadSessiondefers the replay viasetTimeout(..., 0)into the next macrotask- The replay burst is wrapped with
replayStart/replayEndenvelopes - The webview adds a
_replayingflag that silencesascroll()for the duration - A single final scroll-to-bottom is performed on
replayEnd
🛠 Internals
src/chat/agent-loop.js/src/chat/provider.js— context-window management core +ctxUsageevent sourcesrc/chat/compact.js— rolling summary +/compactimplementationsrc/chat/context-refs.js—/contexttoken breakdownsrc/chat/session-store.js— persist & replay summary nodessrc/tools/file-read.js— large-file hint outputsrc/api/anthropic-client.js/src/api/openai-client.js— minor cleanupssrc/errors.js— copy tweaksmedia/chat.{css,js}/src/webview/html.js—#ft-ctxring + popover;_replayingsuppressionsrc/utils/i18n.js— new bilingual strings for context management
🔒 Security / compatibility
- Webview CSP unchanged
- No new runtime dependencies (still just
@anthropic-ai/sdk/openai/js-tiktoken) - Rolling summary uses the existing API channel — no new network entrypoints
- All token accounting happens locally; nothing extra is transmitted