给 DeepSeek Harness 加记忆

dsh 自己的会话由 session-query 回答;这一页讲剩下的那部分

dsh 本来就能回答关于它自己对话的问题——内置的 session-query 子系统就是干这个的。这一页讲的是另一个问题:在同一台机器上,你在 Claude Code、Codex、Cursor、opencode 或 Zed 里做过什么,包括 dsh 还没装上来之前。

dsh 已经有的部分

会话放在 $DSH_HOME(默认 ~/.dsh)下,格式是 zstd 分帧的 JSONL,一个会话一个文件,session-query 搜的就是它们。两个限制:只有 dsh 自己的历史,而且新会话不会主动去查,除非你开口。

接上召回

dsh plugin --profile web add dsh-deja

插件跑的是 deja 二进制,索引由它来建。npm 会随包装一份,但 PATH 上已有的 deja 优先,DEJA_BIN 又能覆盖这两者——所以版本由你自己的 deja update 或 brew upgrade 决定,而不是某个插件版本冻住的那一份。

如果用 CLI:

deja install dsh-auto

这条命令把 MCP 服务器和 /deja 命令写进 profile 的补丁层,并装上那个把召回放到模型前面的插件。deja install --auto 一次过对这台机器上其他每个智能体做同样的事。

两种方式一起用也没问题:包会去看安装器在 $DSH_HOME/plugins/deja/ 里写了什么,只补缺的那部分,所以不会出现两个 /deja 命令或者同一段召回来两次。

装完多了什么

六个模型可以调用的工具——搜历史会话、完整读一个会话、看某个文件的改动史、问某个报错最后是怎么修好的、问某条命令在这台机器上实际怎么跑、记下一个结论——一个直接提问用的 /deja 命令,以及会自己到场的召回:每次组装之前,插件会问这台机器的历史能不能回答当前提问,能就加进去。多数情况下它什么也不说。

如果你自己写 dsh 插件,有个实现细节值得知道:召回走的是 ctx.systemPrompt.context,不是 agent/pre-step 上的中间件。那个看起来更顺的写法能正常加载、能跑完一轮,但永远到不了模型——瀑布流里后面的监听器会用 payload 重建自己的回答,插进去的消息被丢掉,而且什么都不报。这个结论是靠读 dsh 实际发出的请求定下来的。

和这个 harness 无关的那一半

索引覆盖这台机器上每个智能体的转录——今天是三十四个,各有各的格式——所以在一个工具里找到的修法,能回答在另一个工具里提的问题,包括这一切装上来之前的会话。这就是选择索引、而不是选择边用边记的原因。

这里没有任何东西在写记忆,所以也就没有什么能凭空编进你的历史里;建索引和检索都在本地,凭据在建索引时就被脱敏(隐私说明)。每次提问注入上限 1536 字节,每次工具调用约 4 KB——记忆要花多少 token 里有实测对比。

快速开始 · 换一个智能体 · 插件源码