dsh-compact-focus
DSH 压缩指令插件:给 /compact 增加可选的摘要重点,让压缩后的摘要优先保留指定内容。
- Stars
- 0
- Language
- JavaScript
- Created
- Oct 17, 2026
- Updated
- Oct 17, 2026
Introduction
dsh-compact-focus
给 DeepSeek Harness 的 /compact 加上“摘要重点”:压缩较早历史时,告诉摘要器这次要重点保留什么。
交接/维护文档:HANDOVER.md(实现原理、安装/升级 Runbook、验证记录、已知坑、故障排查)。 规范审查记录:COMPLIANCE.md。 仓库目录:本目录(移动目录后必须重跑
install.ps1,否则 profile 里的 junction 仍指向旧路径)。
/compact → 和内置命令一样,压缩较早历史
/compact 重点总结项目框架 → 压缩较早历史,并让摘要优先保留“项目框架”相关内容
/compact 重点保留部署与数据库相关决策 → 同上,摘要重点换成部署与数据库
它是怎么工作的
DSH 的压缩(compaction)会把“会话表面上的一段较早历史”替换成一条摘要,内置 /compact 不接受参数,摘要指令也是固定的。本插件替换 preset-standard 里 compaction 组的两项:
| 内置 | 替换为 | 说明 |
|---|---|---|
@deepseek-ai/dsh-compaction-basic | dsh-compact-focus(后端) | 继承官方后端,只覆盖 summarize():有重点时在摘要请求末尾追加一条 focus 指令 |
@deepseek-ai/dsh-command-compact | dsh-compact-focus/command(命令) | 注册同名 /compact,可带可选重点 |
其余行为完全沿用官方实现:自动压缩、阈值、保留近期尾部、compaction/start→compaction/summary→compaction/end 事务、token 计价、错误码都不变。focus 只对“由本次命令触发的那一次摘要”生效,自动压缩永远不受影响。
摘要使用你在该会话里当前选中的模型,而不是“该会话上一次请求用过的模型”。官方摘要器优先复用会话最后一次路由的模型,模型切换后或隔天恢复的旧会话里,这会把摘要请求发到你已经不用的 provider(典型现象:/compact 秒失败并报 Connection error.)。本插件读取会话日志里最新的 model/selection,用当前选择覆盖它;如果行配置里显式写了 summarizationProvider,那仍然是最高优先级(用于固定摘要模型)。
摘要的固定 Markdown 结构不变;focus 只影响结构内的重点取舍,不会新增章节。
带重点时,结果会显示成两行,第一行就是你写的内容:
>_ compact · 重点保存框架
▣ 上下文已压缩 · 已压缩 334 条历史记录(约 184940 tokens)
第二行是客户端自己的压缩标记(可展开看摘要)。为了实现这种拆分,带重点的调用不传
compactNow的sourceCommandId,客户端就不会把命令卡和压缩标记合并——代价是压缩事件里少一个“由哪个命令触发”的关联字段。
不带重点的裸 /compact 仍是原来的单行合并效果(compact · 已压缩 N 条历史记录(约 X tokens))。
失败时的提示会回显本次写的重点(最多 120 字,超出截断),例如:
未能生成有用的摘要,本次未压缩(Connection error.)。尝试已记录在会话日志中。(本次摘要重点:重点保留接入规则)
上面这些文案都只是聊天记录里的一行:command/* 是 log-only 事件,不进模型上下文。
使用方式
前提:当前会话使用 standard 预设(本插件只覆盖 preset-standard;其他预设仍是内置行为)。
- 直接输入:在输入框输入
/compact 重点总结项目框架,回车执行。 - Tab 补全:输入
/com→ 候选菜单出现compact→ 按↓选中它 → 按Tab补全为/compact(指令 chip,自带尾随空格)→ 输入重点(如重点总结项目框架)→ 回车执行。- 注意:DSH 的候选菜单默认不预先高亮,必须先按
↓选中候选项,Tab才会补全;没有高亮时Tab会离开输入框。 - 补全后不输入任何内容直接回车(或点发送)=无参数
/compact:按内置默认规则压缩,不注入摘要重点,与装插件前的行为一致。
- 注意:DSH 的候选菜单默认不预先高亮,必须先按
- 菜单:点输入框的
+→「指令」→「compact」,输入重点后回车;或只输入/compact回车(会先变成指令 chip),再回车执行普通压缩。 - 命令只在 agent 空闲、没有进行中的压缩时可用;压缩期间发送的消息会排队,压缩结束后才开始。
安装
需要 Node/DSH desktop 0.2.1-rc.x(engines.dsh 声明为 >=0.2.1-rc.1 <0.3.0-0)。
git clone https://github.com/Shinarin/dsh-compact-focus.git
cd dsh-compact-focus
pwsh -File .\install.ps1
DSH 的 desktop profile 由 Electron 应用独占管理,
dsh plugin会拒绝该 profile, 所以本仓库用install.ps1建 junction;其他 profile 可优先使用官方的plugin_managerinstall_bundle。
脚本做四件事(可重复执行):
- 在仓库内建
node_modules\@deepseek-aijunction →%DSH_HOME%\profiles\node_modules\@deepseek-ai; - 在
%DSH_HOME%\profiles\desktop\node_modules\dsh-compact-focus建一个指向本目录的 junction; - 在 profile 的
package.json里加入"dsh-compact-focus": "link:<本目录>"依赖; - 把
dsh-compact-focus追加到dsh.profile.bundles,让本包的cordis.patch.yml生效。
最后用宿主同款导入方式自检两个入口,失败会直接报错。
第 1 步不是多余的:
link:安装时 Node 从本仓库的物理路径解析插件的@deepseek-ai/*依赖。缺了这层,两个入口都会ERR_MODULE_NOT_FOUND,而 DSH 会静默跳过整个 bundle —— 表现为“装好后毫无反应、也没有报错”。
然后完全退出并重新启动 DSH desktop。重启后新建会话,输入 /compact 重点… 即可。
确认安装是否真的可加载:
npm run check:install # 两行 ok 才算装好
卸载
pwsh -File .\uninstall.ps1
移除 bundle 条目、依赖和 junction,重启 DSH 后恢复内置 /compact。
调试
$env:DSH_COMPACT_FOCUS_DEBUG = '1' # 在启动 DSH 的环境中设置
摘要请求注入 focus 时,Host 的 stderr 会打印一行 [dsh-compact-focus] injecting …。
已知限制
- 只覆盖
preset-standard;zcode-architect等自定义预设仍是内置/compact。 - 摘要结构固定,focus 只能影响结构内的重点取舍,不能改变输出 schema,也不能指定“压哪一段历史”(压缩范围仍由官方策略选)。
- 每次
/compact的 focus 只作用于该次摘要;不会持久化为以后每次压缩的默认值。 - 压缩不缩小系统提示词、工具定义和 session 前缀;单个不可分的大单元仍可能压不动。
- 摘要本身仍是一次额外的模型调用;focus 指令只增加几十个 token。
- 摘要走“当前选中模型”:若该模型的上下文窗口小于要压缩的历史,摘要会失败;换回大窗口模型,或在行配置里显式固定
summarizationProvider/summarizationModel。 - 安装依赖仓库内的
node_modules\@deepseek-ai软链来解析宿主依赖;删掉它插件会整体加载失败,重跑install.ps1即可修复。
DSH 插件规范符合性
本包按 DSH 0.2.1-rc.2 的 bundle/plugin 规范组织,完整审查记录见 COMPLIANCE.md。要点:
package.json声明dsh.bundle.patch、dsh.manifestVersion、engines.dsh,并导出运行时入口、locale 与 icon;cordis.patch.yml使用 Loader 的 row override 语法,覆盖整份preset-standardconfig(Loader 的 override 不做深合并);- 后端是服务类默认导出(
FocusCompactionEngine extends BasicCompactionEngine),命令是apply(ctx)+inject+ctx.effect; locale/en.json、locale/zh.json与icon.svg提供插件页显示信息;- desktop profile 的安装方式见上文说明(app-managed profile 的已知例外)。
升级注意
cordis.patch.yml 里的 preset-standard 插件列表是生成快照(生成时基于 @deepseek-ai/dsh-web-app 0.2.1-rc.1;已在 0.2.1-rc.2 上核对标准预设未变)。DSH 大版本升级后若标准预设增加/改名了插件,需要重新生成:
# 在插件目录内执行:
# 1. 从安装包导出当前 standard.patch.yml(app.asar 内)
node tools/asar.mjs "<安装目录>\resources\app.asar" cat "dsh/node_modules/@deepseek-ai/dsh-web-app/presets/standard.patch.yml" > standard-preset.source.yml
# 2. 重新生成 cordis.patch.yml
node tools/gen-focus-patch.mjs standard-preset.source.yml cordis.patch.yml
升级导致插件加载失败时,先卸载本插件即可恢复内置行为。