Max-Null/dsh-memory ↗★ 4

@max-null/dsh-memory

Cross-session plaintext memory plugin for the DeepSeek Harness — deterministic BM25 recall, writes take effect immediately, signal-driven injection, no embeddings 适合需要管理提示词模板库、实现记忆自动常驻与召回的智能体任务。

패키지
@max-null/dsh-memory
호환성
미검증
Harness peer 범위
^0.1.1-rc.1
Cordis peer 범위
^4.0.1
버전
0.12.1
라이선스
MIT
최근 업데이트
2026. 9. 22.

설치

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:Max-Null/dsh-memory

使用流程(写入即生效,人为例外干预)

提示词模板库(0.6.0):prompt_search / prompt_get / prompt_list / prompt_add 四个工具管理模板库—— md 文件是唯一事实源(~/.dsh/prompt-library/*.md 为 global;/.dsh/prompt-library/ 随工作区分享), 前端(记忆面板「模板」tab / 模型工具)检索同一份索引;模板存在即生效(source: agent 角标标识模型新增), 永不注入 system prompt。

模型 memory_save     →  status: approved,立即生效;命中密钥/凭据规则则隔离(不进检索也不进注入)
                        给 injected 则同时钉住常驻(0.8.0),不吃下面两条自动规则
memory_search        →  关键词/语义召回(只搜记忆;模板走 prompt_search 通道,不会混进候选池)
命中累计 2 次         →  injected: true(自动打开常驻:global + 当前会话工作区,摘要化 + 预算截断)
30 天未再命中         →  自动撤下常驻(只撤自动开的;人工或模型显式动过的开关双向豁免)
人(面板 / 开关)     →  钉住 / 删除 / 放行隔离记录 / 回滚
memory_forget        →  随时删除(删除始终是人的动作)

两条自动规则撑起淘汰机制:反复被检索命中是它值得每轮付费的证据,长期不再被命中则自动退出常驻。两者都不删除任何内容——记忆不会无限累积,也不会被系统自行清空。

自动规则对低频但关键的记忆(长期约定、判据、委托)够不着:它们不会被反复检索,够不到阈值;勉强够到也会被 30 天撤下。这类走显式路径——在 memory_save / memory_update 里给 injected 即钉住,写的是与面板开关同一套语义(injectedAuto: false),此后不受两条自动规则影响。未审核与已隔离的记录不接受注入。

注入有字符预算(默认 1500,config injectionBudget):装不下的条目整条丢弃(不截内容),按「最近更新优先」取舍——所以 injected: true 不等于「每轮真的在场」,它只保证有资格排队。0.9.0 起这种出局不再无声:注入末尾会追加一行 (另有 N 条常驻因预算未注入:…),0.9.1 起列出的是每条的短摘要而不是 id——查 id 是什么的那一步最容易省略,省略了就等于没报;清理干净即自行消失。面板的注入预览里也能展开看明细。诊断行本身不占预算。

记忆还可声明有效性锚点(环境变量 / 工具清单 / 插件版本):所绑的值变化后,这条记忆被标记 stale 并撤下常驻,检索结果里也带出失效提示——环境变了,旧结论就不再被当成仍然正确。

模型写入不需要人点头,但人始终能看见并推翻:面板按「隔离区 / 常驻 / 冷数据」分组,被隔离的记录必须由人放行才会重新进入检索。

可选配置

在 cordis.yml 的 config 里传给插件(均可省略):

- id: memory
  name: '@max-null/dsh-memory'
  config:
    injectionBudget: 1500        # 常驻注入预算(字符;null = 不限制)
    summaryChars: 80             # 单条注入摘要截断上限(字符)
    semanticTopK: 5              # 语义侧参与融合的 topK(仅配置 embeddings 时生效)
    # 混合语义检索(可插拔;缺省 = 纯 BM25)
    # embeddings: { embed: '...' 提供 embed(texts) 的宿主函数 或 插件名 ... }

embeddings 接受 { embed(texts): Promise, similarity? } 对象——由宿主装配层提供嵌入实现(如 DeepSeek 嵌入端点);配置后 memory_search 以 BM25 + 语义 RRF 融合,向量增量生成并持久化,嵌入调用失败自动降级为纯 BM25。