dsh-memento

59Star1Fork0Issue0Watching

为 DeepSeek Harness 补上有界、分层、带审批门、可审计的跨会话记忆:本地 SQLite 存储、memory 工具与每次会话启动注入的冻结快照。

语言
JavaScript
License
Apache-2.0
分支
main
agent-memoryapprovalauditcordisdeepseek-harnessdshdsh-pluginllm

安装

$ dsh plugin --profile web add github:PerryLink/dsh-memento

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

一句话定位

dsh-memento 是 DeepSeek Harness 的跨会话记忆能力接缝插件。它把记忆做成一项类型化服务(ctx.memory),让 DSH 在每次新会话启动时自动把过往偏好与项目约定注入系统提示词,并在每次写入前强制走人类审批门。

核心能力

  • 通过 memory 工具在会话内新增、改写、删除、整合或检索记忆条目,全部写入路径走统一审批门
  • 在每个会话首次组装提示时,把当前记忆的快照冻结并注入 systemPrompt,会话内不再变化
  • 每条写入都落审计行(含被拒绝的情况),并通过审批对把完整载荷写入会话日志,可事后重建
  • 维护两个轨道(user / agent)×两个层(user-global / workspace)×按 agent 隔离的记忆空间,硬字符预算防止溢出
  • 通过 ctx.memoryAdapters 注册表接入第三方记忆格式(mem0、Hermes memory.md、CLAUDE.md),导入导出均经审批
  • 会话压缩成功后自动生成待审批记忆提案,需用户确认才会落地

技术实现

  • 语言: JavaScript(纯 ESM,.mjs;无 TypeScript 编译步骤,类型契约由 .d.ts 提供)
  • 关键依赖: @deepseek-ai/cordis@deepseek-ai/dsh-tools@deepseek-ai/dsh-sessionnode:sqlite(Node 内置 SQLite 同步驱动)
  • 架构模式: 三角色 seam —— Service Definition(ctx.memoryindex.mjs 中的 MemoryService)+ Provider(lib/store.mjs 本地 SQLite,WAL 模式,权限 0600)+ Consumer(memory 工具 + systemPrompt.section 冻结快照);通过 inject: ['tools', 'systemPrompt', 'approval'] 接入宿主,禁用(enabled:false)时整套能力整体消失
  • 入口文件: index.mjs(插件唯一面向宿主的文件,lib/ 保持零 DSH 依赖)

适用场景

当你希望 DSH 跨会话记住用户偏好(语言、风格、雷区)、项目约定(构建命令、目录结构)和已学到的教训,但又不想让模型自己悄悄往系统提示里塞东西时,本插件提供"先审批、后落盘、可审计"的工作流。它尤其适合需要长期维护同一项目的开发者和团队——下次打开 DSH 时无需重复交代背景,所有上下文都已按层就绪。

前置依赖与兼容性

依赖最低版本说明
DeepSeek Harness0.1.0-rc.6+package.json#dshWorkshop.compatibility.dshVersions 声明
Node^22.19.0 || >=24.0.0package.json#engines.node
平台跨平台Windows / macOS / Linux 均可,零原生代码编译
原生模块node:sqliteNode 内置 SQLite 同步驱动,零外部原生依赖
Peer 依赖@deepseek-ai/cordis ^4.0.1、@deepseek-ai/dsh-tools >=0.1.0-rc.6、@deepseek-ai/dsh-session >=0.1.0-rc.6、@deepseek-ai/schemastery >=3.0.0由宿主提供

安装方式

dsh plugin --profile web add github:PerryLink/dsh-memento

配置项

配置类型说明默认值
enabled布尔总开关;设为 false 后工具、注入、服务、审批 answerer 全部消失true
dbPath字符串记忆库文件绝对路径;留空走 $DSH_HOME/dsh-memento/memory.db(Windows 上 $DSH_HOME 缺失时回退到 ~/.dsh''
budgets.user.userGlobal数字用户相关事实的"全局"层硬字符预算2000
budgets.user.workspace数字用户相关事实的"工作区"层硬字符预算2000
budgets.agent.userGlobal数字环境/项目事实的"全局"层硬字符预算4000
budgets.agent.workspace数字环境/项目事实的"工作区"层硬字符预算4000
writePolicyask | auto | off全局写审批策略(模型不可见、不可改)ask
writePolicies字典粒度写策略,键可为 track/scopesource:<name>{}
languageen | zh快照文案、/memory 命令、工具描述、面板的语言en
snapshotOrder数字快照段在 systemPrompt 中的顺序(数值越小越靠前)-50
maxEntriesPerQuery数字memory query 单次默认返回上限(Provider 硬钳 1000)20
commandListLimit数字/memory list / query 单次渲染条数50
commandAuditLimit数字/memory audit 单次渲染审计行数10
recall.historyLimitDefault数字memory_recall 工具默认扫描的历史会话数8
recall.snippetCap数字每个会话返回的历史片段上限5
recall.snippetChars数字每个片段字符数上限300
recall.windowDays数字历史片段回看天数30
panelEntriesLimit数字Web 面板条目分页大小200
panelAuditLimit数字Web 面板审计默认条数20
auditRetentionDays数字审计行保留天数,0 表示永久保留0
proposals.enabled布尔会话压缩后是否自动生成待审批提案true
proposals.maxChars数字单条提案字符上限2000
proposals.maxPending数字待审批提案数量上限8

常见问题

Q: 写满了会怎样?会自动压缩吗?

A: 不会自动压缩。超过预算会抛 BUDGET_EXCEEDED 结构化错误(携带当前用量与上限)。请先用 consolidate 把多条合并,或用 remove 删掉不需要的条目,再重新写入。Provider 层从不静默截断。

Q: 模型能绕过写入审批吗?

A: 绕不过。审批门做在 ctx.memory 服务的写方法内部(MemoryProtocolCore),不在工具层。任何路径(memory 工具、/memory 命令、未来其它插件)只要调 add/replace/remove/seed 都必须经过 ctx.approval.requestwritePolicy 是模型不可见的配置。

Q: 记忆数据存放在哪里?会上传网络吗?

A: 默认存放在 $DSH_HOME/dsh-memento/memory.db,POSIX 权限 0600,纯本地 SQLite。插件 manifest 显式声明 network:none / credentials:none,整个生命周期不发起任何网络请求。

Q: 卸载插件会丢失记忆数据吗?

A: 不会丢失。dsh plugin --profile web remove dsh-memento 仅卸载插件,SQLite 数据库与会话日志都保留。插件也从不向会话日志 append 未注册类型的事件,因此旧会话可以正常加载。

Q: 会话中途修改记忆,模型的快照会立刻更新吗?

A: 不会。快照在每个会话首次组装 systemPrompt 时冻结一次,会话中途的写入只落盘和审计,不回写到已注入的 system 段——这是为了稳定前缀缓存,也是"模型可见即会话日志可重建"的一部分。

Q: 支持中文(CJK)记忆条目的子串搜索吗?

A: 支持。检索使用大小写不敏感的 instr 而非 FTS5,因为 SQLite 内置分词器对单字 CJK 字符索引不友好;instr 对中文场景天然正确,且对插件零依赖。

Q: 同一个 $DSH_HOME 下两个 DSH 进程同时写会怎样?

A: SQLite 通过 busy_timeout 串行化单进程内的写入;跨进程一致性不保证,先写者赢。这是 SQLite 文件共享的固有行为,与 Hermes 等终端记忆的官方警告一致。

Q: 和官方推荐的 MCP 记忆服务器是什么关系?

A: 可以共存。dsh-memento 是 DSH 原生的本地第一方实现(零网络、不依赖外部进程),MCP 记忆是官方文档建议的外部服务器路线;两者同目标、不互斥,用户可按场景任选其一或同时启用。

上手难度

进阶 — 配置项较多(预算、审批策略、适配器),但默认配置即可直接使用;进阶用户需要理解"轨道 × 层 × agent 隔离"模型与审批 waterfall 才能调出最贴合的策略。

已知问题与限制

  • rc.6 会话事件未实际发出:插件在 types.d.ts 声明合并了 memory/added|updated|removed|recalled|snapshot 五种 SessionEventMap 词汇,但 DSH 0.1.0-rc.6 没有插件事件注册面,运行时默认不 append;审计链由审批对的 approval/asked + approval/decided 与插件自有审计表承担,等 harness 收录 memory/* 后自动开启。
  • ask 策略需要人类 answerer:当 profile 未配置 UI/ACP 形式的审批回答者时,ask 策略下的写入会失败关闭;如需无人值守写入请改为 auto,或显式用 off 整体关停。
  • 无 FTS5 索引:检索走 instr 子串匹配(大小写不敏感,对 CJK 友好);大数据量场景下查询效率低于全文检索,可通过 limit 参数缩小范围。
  • 跨进程共享同一 $DSH_HOME 时存在竞态:SQLite 文件锁保证单进程内串行,但跨进程一致性不保证;多终端同时编辑同一目录需要自行协调。