前言¶
在 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 为准):
recall_save:只保存调用方传入的role、text;可选sessionId(默认当前 agent ID,host 直调时为manual)。相同 role/text/session 重复写入会返回已有记录。recall_search:对已保存文本做大小写不敏感的字面 AND 匹配,按时间从新到旧;省略query则列出摘录。结果含id、revision、role、text、sessionId、savedAt。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