dsh-recall:为 DSH 项目保存可检索的对话摘录

前言

在 DSH 里跑智能体时,很多结论只出现在某次对话里:技术选型、约定好的路径、临时拍板的规则。重启会话或换 agent 后,这些内容不会自动变成项目里的可查资料。有人靠 Markdown 笔记或全局记忆插件,但要么要手动整理,要么和「当前仓库、当前工作目录」绑得不紧。

dsh-recall 是 LIghtJUNction 维护的 DSH 插件(社区分类:记忆),定位是 Searchable project conversation excerpts for DSH:由调用方显式写入摘录,再在项目本地做字面检索。它不接管 DSH 会话日志,也不自动把历史对话灌进上下文。

这是什么

  • 名称:dsh-recall(npm 包名 @lightjunction/dsh-recall,版本 0.1.0)
  • 依赖环境:DSH 0.2.1-rc.2,Node >=24(README 写明本地在 Node 26 / TypeScript 5.9.3 开发与测试)
  • 解决的问题:在当前项目工作区里,保存少量对话摘录并支持搜索、按 revision 删除,供后续 agent 或 host 调用工具查询

存储与读写发生在 DSH 宿主机上的本地目录,不是 remote world 适配器,也不是安全沙箱。

核心功能

插件通过 Cordis 暴露三个工具(行为以 README 为准):

  1. recall_save:只保存调用方传入的 role、text;可选 sessionId(默认当前 agent ID,host 直调时为 manual)。相同 role/text/session 重复写入会返回已有记录。
  2. recall_search:对已保存文本做大小写不敏感的字面 AND 匹配,按时间从新到旧;省略 query 则列出摘录。结果含 id、revision、role、text、sessionId、savedAt。
  3. recall_delete:仅当 id 存在且 expectedRevision 与当前一致时删除一条;未知 ID 或 revision 过期会明确失败。

README 强调:摘录是不可信引用数据,不是指令;不会自动搜索、复制或摘要会话日志;role / sessionId 由调用方提供,插件不做独立鉴权。

安装与启用

Release 发布后,从 GitHub Release 安装构建好的 tgz(README 给出的 v0.1.0 资源 URL 为预期位置,是否已发布需以 Release 页为准;安装时使用同 Release 附带的归档与 SHA256SUMS):

dsh plugin --profile headless add https://github.com/LIghtJUNction/dsh-recall/releases/download/v0.1.0/lightjunction-dsh-recall-0.1.0.tgz
dsh headless --dump-config

安装后需重启 DSH。若你用的不是 headless profile,把命令里的 profile 换成自己的即可。包内带 DSH bundle patch 与编译后的 JavaScript,不需要 Pi 依赖。

默认 bundle 配置为 {}:各工具使用 invoking agent 的工作目录。无 agent 的 host 调用必须显式配置 root。要在宿主机固定某个本地仓库,可在 profile 的 cordis.patch.yml 里覆盖:

- id: dsh-recall
  config:
    root: /absolute/local/project

root 必须已存在,由 DSH 宿主机上的 Node 文件系统 API 解析;远程 DSH world 或 sandbox 不会重定向这些操作——仅建议在宿主机本地项目上启用。

典型用法

README 给出的自然语言示例:

  • 让 DSH 执行:「Explicitly save this decision in recall: we chose SQLite for the local cache.」
  • 之后:「Search recall for sqlite cache.」

对应的工具调用形态如下。

保存:

recall_save({role:"user",text:"We chose SQLite for the local cache",sessionId:"optional-source-id"})

搜索:

recall_search({query:"sqlite cache",limit:10})

删除(需使用搜索结果中的 id 与 revision):

recall_delete({id:"<result id>",expectedRevision:"<result revision>"})

存储、限额与并发

数据文件路径:<workspace>/.dsh-recall/records.json。目录创建为 0700,替换文件为 0600(具体以文件系统为准)。内容是明文,无加密——只存适合留在项目里的内容,勿存密钥;README 建议把 .dsh-recall/ 排除出版本控制,且插件不会改你的 .gitignore。

限额(README 原文):最多 200 条记录 / 合计 4 MiB;单条摘录最多 50,000 UTF-8 字节;sessionId 最多 200 字符;搜索 query 最多 500 字符;limit 为 1–50。拒绝遍历、符号链接存储路径与非 regular 文件;存储损坏时fail closed,不会静默重置;搜索不会创建存储。同一 root 下多 agent 共享记录,重启 DSH/插件后仍保留。

写路径使用 .dsh-recall/write.lock 独占;并发写失败报 “store busy” 可重试;成功写入通过 fsync 临时文件再原子 rename。崩溃可能留下 lock/temp,需停掉所有写者、检查存储后手动清理;无自动抢锁。插件不提供 Pi picker/menu、全局 Pi 迁移、Markdown 模板、自动会话采集、替代 DSH session-search 或自动 prompt 注入。

适用场景与注意

适合:需要在单个本地项目里沉淀少量、可检索的决策或对话片段,并由 agent 通过工具显式写入/查询的场景。

不适合或需知:指望自动同步完整会话、远程 world 内存储、或把 recall 内容当权威指令执行——这些都不在插件设计范围内。

安装前请自行查看 GitHub 仓库 源码与 MIT 许可证(NOTICE 含上游归属说明)。插件以当前 DSH 进程权限访问本地文件;路径检查针对常规 symlink 等与 bounded read,不能抵御恶意进程并发替换祖先目录——应在可信本地工作区使用。Linux/macOS 为预期目标平台,Windows 未在 README 中验证。

DSH 生态强调「一切皆插件」;SkillHub 目录页 为社区站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-recall 把「项目内可搜的对话摘录」收成三个明确工具:显式保存、字面搜索、带 revision 的删除,数据落在 .dsh-recall/records.json。若你的 workflow 需要轻量、本地、可审计的片段记忆而非全量会话镜像,可按 Release 安装并在本地 profile 中配置 root 后试用。

  • 目录页:https://www.skillhub.cn/plugins/LIghtJUNction/dsh-recall
  • GitHub:https://github.com/LIghtJUNction/dsh-recall
羽毛球分组比赛记分
小程序二维码

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

小夜