dsh-ctx-log:在上下文压缩后仍能回溯会话轨迹

前言

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/message
  • assistant/message
  • tool/call
  • tool/result
  • turn/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 给出的步骤如下:

  1. 取得本仓库目录(例如从 GitHub 仓库 下载 zip 解压,或使用你已信任的本地副本路径);
  2. 打开 DSH 桌面端 → 侧栏 插件 → 添加插件 → 填写该目录的绝对路径(也支持 git 地址、npm 包名或 zip);
  3. 应用后等待一次重载;
  4. 验证:新开一轮对话,系统提示应出现 【上下文轨迹】… 相关行;同时 ~/.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 与 社区目录页。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜