dsh-context-graph
Indexes each chat of a workspace into a small topic graph every 4 turns (one model call, verbatim source kept under .context-graph/), appends up to 5 matching topics from the other chats to each message, searching a named day such as "yesterday" first, and adds a recall tool that returns the origina
Install
dsh plugin --profile web add dsh-context-graph
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
上下文图谱(dsh-context-graph)
DeepSeek Harness 插件:给每个对话一张小型记忆图谱,安装后默认开启。同一工作区里的其他对话会收到几行指向过往结论的提示,模型需要细节时再取回原文。旧消息不再重复发送,结论也不会丢失。
第一原则:在不损失质量的前提下减少输入 token。
如何关闭: 插件页 → 上下文图谱 → 关闭开关,所有对话都不再索引,也不再往请求里加内容。只想停用某个对话,在该对话里运行 /context-graph off。
它做什么
每个对话默认开启记忆:
时机 · 发生了什么
每个对话 · 每 4 轮人类发言索引一次:一次小型模型调用把主题写进 .context-graph/chats/<对话>/graph.json,并原样保存被引用的消息。不会拖慢回复。
每个对话的第一条消息 · 附上本工作区已共享的对话列表(最新在前):对话编号、日期、标题、主题数。
每条人类消息 · 按词语重合匹配其他已共享对话的主题(不调用模型),把最多 5 个相关主题附在消息末尾。唯一且很短的命中会直接附原文。
消息里提到时间 · “昨天”“上周”“11月1日”“2026-11-01”……先搜那个时间段:先按对话,再按主题,最后才搜全部。没有命中时,列出那段时间的对话。
模型调用 recall · c3n12:该主题的原文和相邻主题。c3:某个对话的主题列表。2026-11-01:那天的全部对话和主题。t7:当前对话第 7 轮的原文。
共享 · 每个对话默认与同一工作区的其他对话共享。只是一个标记,不复制、不合并。/context-graph unshare 让某个对话保持私有。
设计规则:
1. 默认开启,随时可关。 插件页关闭本插件即全部停用;/context-graph off 只停用当前对话。
2. 没有原文不写入。 主题只和它来源的原始消息一起保存。要点是指针,不是记录。
3. 只组织,不合并。 每个对话的图谱留在自己的文件夹里,带自己的日期。编号带对话号(c3n12),每个主题都能追溯到来源对话。
4. 时间是第一过滤条件。
5. 只在末尾追加,保住服务商的前缀缓存。隐藏或折叠旧轮次不是本插件的工作。
命令
输入 /context-graph,在菜单里选中后再输入后面的词:
结果显示在 dsh 自带的命令卡片里:第一行是摘要,展开看详情。不带词等于 stats。
on — 恢复本对话的记忆。 记忆默认已开启;on 用于撤销之前的 off,并立即索引一次;之后每 4 轮人类发言再索引一次(每次一个小型模型调用,默认用本对话的模型)。在 .context-graph/chats/<对话>/ 下建立图谱、原文和 meta.json(标题、日期、标记)。此后你在本对话发的每条消息都会去匹配工作区里其他已共享的对话;开启后的第一条消息还会附上这些对话的列表。
卡片:Memory on · 7 topics in this chat · 2 shared chats to draw on
off — 只关闭本对话的记忆。 要在所有对话里关闭,请在插件页关闭本插件。 停止索引,不再往请求里加任何内容。图谱文件保留,之后 on 可以接着用。若本对话已共享,其他对话仍能看到它。
share / unshare — 共享或设为私有。 每个对话默认共享;unshare 让本对话私有,share 撤销私有。共享只是给本对话打一个标记,其他开了记忆的对话就能匹配和取回它的主题。不复制、不合并:图谱留在自己的文件夹,编号带对话号(c3n12),每个命中都能追溯来源。unshare 立刻恢复私有。尚未索引的对话可以共享,但在索引之前没有内容。
stats — 当前状态(默认)。 第一行:记忆开/关、本对话主题数、共享/私有、可见的共享对话数、待索引轮数,以及有新版本时的 update available。正文:版本、记忆文件夹,以及应用启动以来的计数:索引次数与 token、附加块数量与大小、recall 次数、主对话输入的未缓存/缓存读/缓存写与缓存命中率。命中率高,说明记忆在省钱而不是花钱。
build — 立即索引。 不等下一个 4 轮节点,适合在切换对话前运行。需要记忆已开启。模型输出无法解析时,原始输出保存到该对话文件夹的 last-builder-output.txt,卡片说明原因。
map — 工作区的全部对话。 最新在前:对话编号、开始日期、标题、主题数和标记(this chat、memory on、shared/private),下面列出各自连接最多的主题及编号。这是图谱的文字版;可视化页面在计划中。
find 关键词 — 在已共享对话里查找。 用的就是插件匹配你消息时的同一套规则,可以看到模型会被展示什么。时间词会缩小范围:find 524 超时 上周 先搜上周活跃的对话。只搜其他对话,本对话自己的主题已在上下文里,不重复。
取回编号
编号 · 返回
c3n12 · 对话 3 的主题 12:名称、要点、原始消息原文、相邻主题
c3 · 对话 3:标题、日期、按连接数排序的主题
2026-11-01 · 当天活跃的全部共享对话,各自那天的主题在前
t7 · 当前对话第 7 轮的原文,含工具调用与结果
时间词
昨天/yesterday、前天、3天前、上周/本周、上个月/本月、2026-11-01、11月1日。先搜那段时间活跃的对话,再搜那段时间更新的主题,最后才搜全部;都没有时列出那段时间的对话。
安装与更新
插件 → 添加插件 → 官方 npm 源 → 输入 dsh-context-graph,安装后完全重启应用。
有新版本时,你的下一次回复末尾会提示一次,/context-graph 的第一行也会显示。更新方法:打开本插件 → 卸载 → 添加插件 dsh-context-graph@新版本号 → 重启。务必写明版本号:dsh 的 pnpm 默认会暂缓刚发布的版本。
文件
.context-graph/chats/<对话>/meta.json 编号、标题、开始/最近时间、轮数、builtSeq(已索引到哪里);执行 off / unshare 后才有 memoryOff / private .context-graph/chats/<对话>/graph.json 主题与链接,每个主题带时间 .context-graph/chats/<对话>/src/<id>.md 每个主题背后的原始消息
已知限制
- 重启后,续聊的第一次索引会重读整个对话(编号复用,不会重复)。
- 两个代理同时写同一个对话的图谱:后写的覆盖先写的。
- 子代理会话不索引,也不附加记忆。
- 对话标题暂用第一条消息的缩写。
- 侧边栏的可视化图谱页面尚未实现,
/context-graph map是文字版。
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::8,最后更新 2026-11-04