DeepSeek Harness 插件

qwert702/dsh-memory

Star 数 ★ 2 分类 记忆 收录于 2026-09-12

dsh 网页端项目级+全局长期记忆:分拆 POST /items 路由避免路径冲突,多轮工具调用上下文压缩后存入记忆项,去重与会话级持久化。

安装

# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)

dsh plugin --profile web add github:qwert702/dsh-memory

装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。

README

DeepSeek Harness 网页端长期记忆插件:项目记忆 + 全局记忆双库,自动提取、自动注入、小模型定期整理,外加一个 Obsidian 风格的记忆图谱。

兼容性:当前版本 2.1.0,适配 harness 0.2.0 / 0.2.0-rc.2(配置走 Config 导出 + apply(ctx, config)、会话日志走 snapshotEvents()、客户端坐席列属主包)。0.1.7 起 harness 已移除 settings.register(),因此本插件不再有可热改的设置命名空间——配置写在 profile 的 cordis.patch.yml 里(见下)。

一键安装:

dsh plugin --profile web add <仓库或本地路径>

例如本地路径:dsh plugin --profile web add "D:\CBN-HT\Desktop\AI编程\dsh插件\dsh-memory(记忆插件)" 装完重启 harness(dsh web)、刷新页面,会话头部「对话 / 轨迹」旁边会出现「记忆」标签页。

  • 本地语义召回(可选增强) —— 安装可选依赖后自动启用 all-MiniLM-L6-v2 本地嵌入(transformers.js 纯 WASM,无原生编译):提取/新增的记忆自动向量化存入 sidecar,注入时按"语义相似度 × 词面重合 × 重要性"融合排序——换说法也能召回。未安装依赖或模型下载失败时自动回退纯关键词检索,状态在 Tab 状态栏可见。国内网络可用 embeddingRemoteHost 配置 hf-mirror 镜像。
  • 整理时自动建链 —— 每次整理对余弦相似度 ≥ autoLinkThreshold(默认 0.78)且尚无关联的活跃记忆对自动补 related 双向边(单次上限 30 条),图谱随使用自然生长。
  • 记忆详情与溯源 —— 列表中点击任意记忆展开详情卡:完整内容、类型/标签、创建与更新时间、强化次数;关联记忆可点击跳转;「打开来源会话」一键跳回当初产生这条记忆的对话(0.2.0 下经 Workspace UI 的 openSession 导航)。

功能

  • 双作用域记忆库:
    • 项目记忆 —— 按会话工作区(cwd 哈希)分库,只在该项目的会话中注入;
    • 全局记忆 —— 跨项目共享,所有会话都注入。
    • 存储为纯 JSON(~/.dsh/memory/global.json + projects/<hash>.json,尊重 $DSH_HOME),原子写入 + 跨进程文件锁(headless/web 多实例并发安全)。
  • 相关性召回 —— host 维护每个会话最近用户输入的滚动缓冲;注入时按"与当前对话的相关度 × 重要性"排序,问什么补什么,而不是盲目补最重要的。
  • 记忆 Tab(轨迹旁边的视图环插槽,纯增量、不替换任何原装组件):
    • 列表视图 —— 一条一张卡片:类型色点、内容、标签、来源时间、强化次数、链接数;行内编辑(内容/类型/标签)、📌置顶、归档/恢复、删除;两步点击建链接(可选 related/supersedes/contradicts 关系);搜索过滤;显示已归档开关;撤销整理 / 导出 MD·JSON / 导入备份。
    • 图谱视图 —— canvas 力导向图:节点=记忆(颜色=类型、半径=链接度)、边=关联;滚轮缩放、拖拽平移/拖节点、点选高亮邻域并显示详情卡;静止后渲染循环自动休眠。
  • 自动注入 —— 监听 system-prompt/assemble 瀑布,把 Top-K 记忆作为动态上下文追加进每个请求;置顶记忆保底携带;无 cwd 的组装只带全局;任何异常都原样放行 assembly,绝不影响请求。
  • 自动提取(v2 协议) —— 监听 turn/end 排队提取;提示词携带既有相关记忆,模型对每条候选标注 add/update/supersede/contradict 动作:更新合并到原条目、取代时旧条目归档并建 supersedes 链、冲突时双向 contradicts 链共存;字面近似去重兜底;子代理会话不参与提取;连续失败 3 次自动暂停——暂停提示依赖「记忆」Tab 处于打开状态(Tab 每 25 秒轮询状态,转为暂停的瞬间弹出一次全局通知);记忆语言跟随对话主语言(可强制 zh/en)。
  • 定期整理 —— 每作用域累计 N 轮自动触发或手动触发:模型提 merge/link/archive/retag 操作流,host 校验后事务应用;过期记忆按 autoArchiveDays 启发式自动归档(不依赖模型);每次模型整理前自动快照,Tab 内一键「↩ 撤销整理」。
  • 多种记录入口:
    • 斜杠命令 /remember <一句话>(存入当前项目/全局库);
    • 每条 AI 回复旁的「✦ 记住」按钮(小模型提炼该消息要点入库)。

小模型路由

辅助调用(提取/整理)走 harness 的 ctx.llm,凭据不出服务器:

  1. 配置里成对填写 extractProvider / extractModel(推荐配一个小模型);
  2. 未配置时跟随会话自身路由的模型(与 dsh-context-compressor 同一约定);
  3. 都没有时报错并在状态栏提示。

配置(profile cordis.patch.yml)

0.2.0 的配置通道是包导出 Config schema + loader 调用 apply(ctx, config):插件没有设置面板、也没有可热改的命名空间,改动即「改文件 + 重载」。

在对应 profile 的 cordis.patch.yml(如 ~/.dsh/profiles/web/cordis.patch.yml)里按条目 id 覆盖,条目 id 由插件自带补丁 dsh-memory.yml 插入时固定为 ui-memory:

# profile patch 的 config 是「整体替换」语义:没写的字段由 Config schema 的
# 默认值补齐(插件侧再兜一层 DEFAULTS),所以只写想改的键即可。
- id: ui-memory
  config:
    enabled: true                 # 总开关(false 时所有管线与写路由停用)
    injectEnabled: true           # 自动注入开关
    autoExtract: true             # 自动提取开关
    extractProvider: ''           # 提取模型路由(成对填写;留空跟随会话模型)
    extractModel: ''
    manageProvider: ''            # 管理/整理专用模型(成对填写;留空则用提取模型)
    manageModel: ''
    consolidateEveryTurns: 20     # 自动整理的提取轮次阈值(0 = 关闭自动整理)
    topK: 8                       # 注入条数上限
    maxInjectChars: 1500          # 注入总字符帽
    maxInputChars: 12000          # 提取回放字符上限
    maxTokens: 1024               # 辅助调用输出预算
    autoArchiveDays: 90           # 过期自动归档天数(0 = 关闭)
    memoryLocale: ''              # 记忆语言:空=跟随对话,或强制 zh/en
    embeddingsEnabled: true       # 本地语义嵌入开关(需可选依赖,见下)
    embeddingRemoteHost: ''       # HuggingFace 镜像(国内推荐 https://hf-mirror.com)
    autoLinkThreshold: 0.78       # 整理时自动建链的余弦阈值(0 = 关闭)

模型分工:extract* 管高频的自动提取与「记住这条」提炼;manage* 管低频的记忆整理/归档。manage* 留空时回落到 extract*,再留空则跟随会话模型。典型用法:提取用便宜快的小模型,整理用更强的模型。

启用语义召回(可选):让插件安装目录能解析到 @huggingface/transformers(在插件目录或 profile 的 node_modules 里 npm i @huggingface/transformers),重启后首次使用自动下载 ~23MB 量化模型(国内可配 embeddingRemoteHost: 'https://hf-mirror.com' 加速)。注意 0.2.0 桌面版自带的 asar 不再内置 transformers.js:装不上就自动回退关键词检索(/status 的 embeddings.state 会显示 unavailable),其余功能不受影响。

旧版本的 ~/.dsh/settings.yaml 命名空间写法在 0.1.7+ 已失效;若曾配置过,请按上表搬进 profile patch。

工作原理

turn/end ──▶ 提取队列 ──▶ 回放新增事件(snapshotEvents)──▶ 小模型出 JSON ──▶ 去重 ──▶ 写库
                                              │
                                     累计 N 轮 ─┴──▶ 整理队列 ──▶ 小模型出 ops ──▶ 校验+应用
任何请求 ──▶ system-prompt/assemble 瀑布 ──▶ 选 Top-K ──▶ 追加 <memory-briefing> 上下文
浏览器「记忆」Tab ──▶ /api/dsh-memory/*(items/add/update/remove/link/unlink/graph/consolidate/extract/undo/export/import/distill/embed/status,共 15 条)
配置 ──▶ profile cordis.patch.yml 的 ui-memory.config ──▶ Config schema 校验 ──▶ apply(ctx, config)
  • 配置通道:包导出 Config(schemastery schema,符合 Standard Schema)→ loader 校验 profile 条目 config → apply(ctx, config);插件把结果与内置 DEFAULTS 合并后固定使用(无热更新)。
  • 会话读取:0.2.0 的 Session 去掉了 events 取值器,插件统一走 snapshotEvents()(不可变快照),deriveEventMessage() / requestHeader() / session.header 契约不变。
  • 机器流量识别:user/message 的来源 source 在 0.2.0 不再有统一 {kind:'plugin'},改为生产者自报 kind。插件同时识别 {kind:'plugin', plugin:'dsh-commander'}(0.1.x 旧拼写)与 {kind:'dsh-commander'}(0.2.0 新拼写);辅助调用自建消息使用 {kind:'dsh-memory'}。

仓库布局

  • lib/index.js — host 半区:Config 导出 + apply(ctx, config) + 监听器(注入/提取)+ 整理管线 + 15 条路由。
  • lib/store.js — 双作用域 JSON 库(缓存 + 每文件串行锁 + 原子写)与持久化游标/计数。
  • lib/util.js — 纯函数:作用域键、相似度、简报挑选、模型输出解析、回放构建、来源分类。
  • lib/embeddings.js — 可选本地嵌入(transformers.js WASM):向量 sidecar 读写与串行推理队列。
  • lib/client.js — 浏览器半区(手写 bundle):conversation.view 增量条目(列表 + 图谱)+ 消息级「记住」动作 + 全局 toast。
  • test/smoke.cjs — node test/smoke.cjs:Config 契约、纯函数断言、路由注册、注入监听器、提取/整理管线(临时 DSH_HOME 隔离)、client 注册、导航与 SSR。
  • test/e2e-flow.cjs — 六阶段端到端业务流(node test/e2e-flow.cjs),同样用 apply(ctx, config) 装配真实插件。

已知限制

  • 配置不可热更新:0.1.7+ 移除了 settings.register(),没有等价的热改通道——改配置必须改 profile patch 并重载;插件也没有设置面板(原「网页设置界面自动生成」能力随该 API 一并消失)。
  • 同步日志读取被官方标记为弃用:Session.snapshotEvents() 在 0.2.0 仍可用且语义等价于旧的 session.events(注释标注「新代码不建议使用」,替代方案是异步的会话查询服务)。本插件用它构建提取回放;若未来版本删除该方法,需要改注入 sessionQuery 一类服务读取日志。
  • 客户端导航依赖 Workspace UI:0.2.0 删除了 sessions.open(),「打开来源会话」改调 uiWorkspace.openSession();该服务缺席时按钮静默失效(不影响其他功能)。
  • 相关性召回以 recent 缓冲中最近人类输入(约末尾 2000 字符)近似当前话题,长上下文的回指与远距离主题召回有限;靠 topK + 字符帽控制体量。
  • 自动整理需要可用的模型路由;未配置且会话未路由过时会失败并提示。
  • 本地语义嵌入需要环境能解析 @huggingface/transformers(0.2.0 桌面 asar 不再内置),否则自动回退关键词检索。
  • 图谱布局为简单力导向(无社区着色等高级特性),数百节点内流畅。
  • Windows 下项目键对路径做了大小写折叠,跨平台共享同一目录视为同一项目。

License

MIT

内容来自项目 README(GitHub)↗

链接

同类插件

查看整个分类 →

社区评论

评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。