前言¶
DeepSeek Harness(DSH)会在长会话里自动压缩上下文。压缩之后,早期的用户与助手原文、工具调用的参数和返回会从模型可见窗口里消失,常见后果包括重复查同一类资料、把过时结论当成当前事实,或在新会话里不知道上一轮做过什么。Claude Code、Codex 等环境可以用会话钩子把原始轨迹写到磁盘;DSH 没有内置同类钩子,但 Host 侧的 session/event 足以实现等价能力。下面介绍社区插件 dsh-ctx-log(维护者 Tom-l-j-h,分类:记忆),它把会话事件按日落盘为 JSONL,并在每轮系统提示里注入轨迹位置、最近摘要与当前时间,让细节在压缩之后仍有机会被模型「捞回来」。
插件定位¶
dsh-ctx-log 是 DeepSeek Harness 的 Host 插件:订阅 session/event,将五类事件逐条追加到按日 JSONL;同时通过 systemPrompt 注入轨迹文件路径、本会话条数、最近 N 条消息摘要以及准确当前时间。依赖仅为 Node 内置模块(node:fs / node:path / node:os),无第三方包,也未声明 @deepseek-ai/* 的 peerDependencies,因此不会触发 DSH 的插件版本闸门。许可证为 MIT(package.json 版本 1.0.0)。
它解决什么问题¶
压缩后的上下文缺口主要体现在三类行为上:
- 忘记刚才查到的结论,重复做同样的事;
- 把很久以前的旧信息当成「现在」;
- 跨会话接手时,不了解上一轮实际发生了什么。
本插件用「全量落盘 + 提示注入」补上这条缝:磁盘上保留可审计的轨迹,系统提示里给模型一条简短的「你在哪里、最近说了什么、现在几点」。
核心功能¶
全量记录¶
插件监听 session/event,对以下类型逐条写入 JSONL(单条有长度截断,默认用户/助手消息 4000 字、工具参数/结果 1500 字):
user/messageassistant/messagetool/calltool/resultturn/end
另在 agent/created 时写入 session/start 一行(含来源与 cwd),便于按会话聚合。
落盘示例(每行一条 JSON):
{"ts":"2026-11-06T07:31:22.123Z","sess":"session-…","seq":42,"type":"user/message","role":"user","text":"…"}
{"ts":"2026-11-06T07:31:25.456Z","sess":"session-…","seq":44,"type":"tool/call","tool":"pwsh","args":"…"}
{"ts":"2026-11-06T07:31:26.789Z","sess":"session-…","seq":45,"type":"tool/result","isError":false,"result":"…"}
默认目录为 ~/.dsh/ctx-log/ctx_YYYY-MM-DD.jsonl(Windows 为 C:\Users\<你>\.dsh\ctx-log\)。
轨迹注入¶
每轮系统提示可注入:
- 轨迹文件的绝对路径;
- 本会话已记录条数;
- 最近 N 条(默认 6)用户/助手消息摘要(跨天时会自动回看上一天的文件尾部)。
实现上约 60 秒缓存尾部读取,避免每轮全量扫盘。
时间与新鲜度¶
每轮注入当前时间,避免长回合中途模型不知道「几点」。可选 watchFiles 监控指定文件的 mtime:超过 3 天标 ⏳、超过 7 天标 ⚠️,并提示引用前先核实。
安装与启用¶
DSH 桌面端的 profile 由 Electron 独占管理,不能通过命令行安装,需在桌面端插件流程中完成。README 给出的步骤如下:
- 取得本仓库目录(例如从 GitHub 仓库 下载 zip 解压,或使用你已信任的本地副本路径);
- 打开 DSH 桌面端 → 侧栏 插件 → 添加插件 → 填写该目录的绝对路径(也支持 git 地址、npm 包名或 zip);
- 应用后等待一次重载;
- 验证:新开一轮对话,系统提示应出现
【上下文轨迹】…相关行;同时~/.dsh/ctx-log/下应出现当天的ctx_*.jsonl。
本插件装进 profile 后对所有会话生效。修改配置后可在插件管理器中 disable → enable 做热重载,或重启应用。
社区目录页:skillhub.cn/plugins/Tom-l-j-h/dsh-ctx-log(独立站点,与 DeepSeek / 幻方无官方从属关系)。
配置¶
配置通过 cordis.patch.yml 传入(安装后也可在 profile 对应条目中修改)。README 中的示例:
- insert:
- id: dsh-ctx-log
name: 'dsh-ctx-log'
config:
logDir: '' # 留空 = ~/.dsh/ctx-log
maxTextChars: 4000 # 用户/助手消息单条上限
maxToolChars: 1500 # 工具参数/结果单条上限
injectTrail: true # 是否注入轨迹路径与摘要
trailRecentLines: 6 # 摘要条数
skipTypes: [] # 例:['tool/call','tool/result'] 可显著降低落盘敏感度
watchFiles: [] # 例:[{ path: 'D:/notes/TODO.md', label: '笔记' }]
| 字段 | 默认 | 说明 |
|---|---|---|
logDir |
~/.dsh/ctx-log |
落盘目录,不存在会自动创建 |
maxTextChars |
4000 |
用户/助手消息截断长度 |
maxToolChars |
1500 |
工具参数/结果截断长度 |
injectTrail |
true |
关闭则只记录、不注入 |
trailRecentLines |
6 |
注入的最近消息条数 |
skipTypes |
[] |
跳过的 session 事件类型 |
watchFiles |
[] |
[{ path, label }],按 mtime 提示新鲜度 |
若只希望落盘、不想污染系统提示,可将 injectTrail 设为 false。
典型用法与数据流¶
工作原理可概括为:
session/event ──(5 类过滤)──> appendFileSync ──> ~/.dsh/ctx-log/ctx_YYYY-MM-DD.jsonl
│
systemPrompt.context() ──每轮──> 读尾部 400 行 ──> 最近 6 条摘要 + 轨迹路径 + 当前时间/新鲜度
日常使用时无需额外命令:启用插件后正常对话即可。需要人工核对历史时,可直接打开对应日期的 ctx_*.jsonl,按 sess、seq、type 检索。README 建议默认保留约 7 天,可用系统命令清理旧文件,例如 Linux/macOS:
find ~/.dsh/ctx-log -name 'ctx_*.jsonl' -mtime +7 -delete
适用场景与注意¶
适合谁: 长会话、多工具调用的 DSH 桌面用户;需要在压缩后仍让模型感知「最近说过什么」、或事后按 JSONL 审计轨迹的开发者。
隐私与安全(必读):
- 默认记录对话全文与工具参数/结果,可能含密钥、个人信息或业务数据;
- 内置
scrub()仅兜底处理常见密码、api_key、Bearer、URL 凭据等模式,不保证脱敏完整; logDir应放在本机专用目录,不要放入云同步盘或共享目录;- 敏感环境可配置
skipTypes: ['tool/call','tool/result']只保留对话; - 插件运行在 Harness Host 进程内,与应用同级文件访问能力 —— 安装前应阅读源码与 MIT 许可证,只装可信来源。
兼容性: README 记载在 DSH Desktop 0.2.x(Windows) 实测;其他版本需自测。注入文案为中文,英文界面下功能不受影响。
结尾¶
dsh-ctx-log 用按日 JSONL 保存会话事件,并在系统提示中注入轨迹路径与最近摘要,针对性缓解 DSH 上下文压缩带来的信息丢失。安装走桌面端插件页,配置集中在 cordis.patch.yml。进一步细节见 GitHub README 与 社区目录页。