dsh-plugin-sessiongraph: Local Full-text Index for Local Session History

前言

在 DeepSeek Harness(DSH)里做智能体或长期协作开发时,会话会分散在多个工作区、多条线程里。想找回「上次在哪条会话里说过某句话、跑过哪条命令」,常见做法是翻侧边栏或去 grep 压缩日志,成本高,且内置的 session_search 对中文分词几乎不可用、索引还在内存里、重启即失。下面介绍社区插件 dsh-plugin-sessiongraph:把本机全部 DSH 会话建成落盘索引,支持跨工作区全文检索,并为中文两字词做了专门分词;索引路径可选 Rust 原生内核,大库下比纯 TypeScript 回落路径更快。

这是什么

dsh-plugin-sessiongraph(维护者 CC19990113,GitHub 仓库 CC19990113/dsh-plugin-sessiongraph)是 DSH 生态里分类为「记忆」相关能力的一类插件:它不替你做记忆抽取,而是把会话原文(用户消息、助手文本、工具调用名与参数、会话标题等)索引成可检索语料。一句话定位:记忆回答「结论是什么」,内置 session_search 回答「哪个会话提到过」,sessiongraph 回答「当时到底说了什么」。

插件以 MIT 许可证发布;当前仓库根 package.json 显示版本 0.1.15,要求 Node ^22.19.0 || >=24.0.0。SkillHub 目录页:dsh-plugin-sessiongraph(社区站点,与 DeepSeek / 幻方无官方从属关系)。

核心功能

检索与作用域

  • 跨会话全文搜索:模型工具 sessiongraph 的 search 可按 workspace、after、before、kinds 过滤,返回标题、工作区、时间、轮次与带高亮的片段。
  • 全机跨工作区:与仅覆盖「调用方工作区」的内置检索不同,索引覆盖本机各工作区的会话。
  • 中文两字词:自建 bigram 分词(与 SQLite 默认 unicode61 无 CJK 处理、两字词在 trigram 下也难命中形成对比);查询侧 token 引号后 AND 连接,偏召回而非短语精确匹配。

读索引的其它入口

能力 说明
session 按完整 id 或唯一前缀打开会话:元信息、有序条目、子会话
timeline 按时间列会话(可限工作区),新→旧
workspaces 工作区清单与统计
status 索引状态;唯一在尚未建库时也能正常回答的操作

写侧由 sessiongraph_index 负责建库或刷新(独立 300 秒预算;源文件 mtime+size 未变则跳过;会话超过 1000 条时可转后台 job 并返回 jobId)。

Rust 内核与引擎选择

索引写入走 napi-rs 原生模块(Rayon + rusqlite),非 WASM,以便直接读写文件系统与 SQLite、处理 GB 级数据。README 给出的参考数据(同一机器、两库内容一致):Rust 全量约 6.76s、增量 59–107ms、查询 0.1–6.9ms、索引约 170 MB;TypeScript 回落全量 19.22s、增量 230ms。配置项 engine: 'auto' | 'native' | 'typescript',默认 auto:有原生则用,缺失二进制时静默回落,不算错误。

自动索引(默认无需手工建库)

装完后默认有四道自动机制:首次无索引时在会话创建后台建库(autoBuild,默认开);已有索引时在 agent/created 做增量;查询前若 status.json 的 indexedAt 超过 5 分钟则先增量;当前未落盘的 live 会话通过宿主 ctx.sessionQuery 纳入。若希望完全手动:autoBuild: false 关首次建库,autoIndex: false 关增量,之后只用 sessiongraph_index 或 /sessiongraph index。

架构要点(与扩展相关)

六个包沿 ctx.sessiongraph 缝隙分层:加 store 或 indexer 不必改模型工具。查询路由为「恰好一个认领者」:并发问所有 store,0 个或多个认领者分别抛 SESSIONGRAPH_UNAVAILABLE / SESSIONGRAPH_CONFLICT,注册顺序与热重载不改变结果。

安装与启用

在 DSH 中安装官方文档给出的命令:

dsh plugin add dsh-plugin-sessiongraph

开发时可 link 本地目录(profile 的 dependencies 与 dsh.profile.bundles,路径按你的 clone 位置填写)。装完重启 DSH;README 说明首次可调用 sessiongraph_index 建库,之后以自动增量为主。

可选配置(均来自 README):injectCommandResults: true 将斜杠命令结果以 plugin/notice 回灌对话(默认关,因命令跑在宿主主线程);updateCheck / updateCheckIntervalMs 控制工具调用后检查 registry 新版本的提醒。

典型用法

1. 让模型查历史

直接提问,例如:「上次讨论开屏广告是哪个会话?」模型会调用 sessiongraph 工具。

2. 斜杠命令

/sessiongraph status
/sessiongraph index
/sessiongraph index --force
/sessiongraph search <词>
/sessiongraph workspaces

无参数的 /sessiongraph 等同于 status。search 会打印前 10 条命中;workspaces 用 * 标当前工作区。

3. 与内置检索、记忆的分工

需求 更合适的选择
偏好、决策、实体等「结论」 OpenViking / MEMORY.md 类记忆
英文关键词、最近会话里的提及 DSH 内置 session_search
原话、命令参数、中文两字词、跨工作区 sessiongraph

一段对话可能永远不进记忆阈值,但仍会进入 sessiongraph 的原文索引;记忆条目则常已脱离上下文,核对细节仍要回会话原文。

适用场景与注意

适合谁:在本机长期用 DSH、会话多工作区、需要按字面或中文短词找回历史发言与工具调用的人;尤其当内置 session_search 在中文或跨工作区场景下不够用时。

安全与权限:插件在当前 DSH 进程权限下运行,会扫描并索引本地会话日志、写入 SQLite 索引库。安装前应阅读 GitHub 源码 与 MIT 许可证,确认可接受其读写的路径与数据范围。

其它注意:索引有意跳过 tool/result 正文、reasoning 块等(详见 README「索引什么」);斜杠命令默认不回灌,避免曾在 handler 中 agent.inject 导致桌面卡住的问题;插件不能自升级,新版本需通过宿主更新 profile 依赖。

结尾

dsh-plugin-sessiongraph 把本机 DSH 会话变成可增量维护、可毫秒级查询的全文库,并在中文两字词与跨工作区范围上补足了内置检索的短板。目录与源码:

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

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

Xiaoye