npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@zheexinn/dsh-memory

v0.5.3

Published

Long-term shared memory plugin for the DeepSeek Harness: LLM auto-extraction, fusion recall (semantic + entity graph), self-maintenance, own-your-storage file backend, remote API & MCP

Readme

dsh-memory


dsh-memoryDeepSeek Harness 的每个会话装上真正的长期记忆:自动抽取、评分、存储、召回;跨会话/子代理/工作流共享;并自我维护——衰减的归档、洞察的反思、噪音的整合——你只管继续工作。

为什么? 每个会话都从失忆开始:你的名字、你的偏好、上周踩过的坑——全忘了。dsh-memory 用一个宿主级单例记忆服务 + 后台 LLM 管线解决它。

✨ 特性

| | | |---|---| | 🧠 五类记忆 | semantic(事实)· episodic(事件)· procedural(方法)· preference(偏好)· insight(洞察) | | 🔄 跨会话共享 | 一个宿主平面单例,多会话/子代理/工作流同读同写 | | ⚙️ LLM 自动抽取 | 每 N 回合把会话浓缩成带重要性/置信度的记忆候选 | | 📉 遗忘曲线 | score = importance × confidence × 2^(−t/半衰期),旧记忆自然衰减 | | 🔍 融合召回 | 评分 × 字符 n-gram 语义相似(TF-IDF 余弦) × 实体共现图谱 | | 🕸️ 实体图谱 | 路径/标识符/版本/引语/高频中文词成为节点,共现成为边 | | 🧹 自我维护 | 衰减自动归档;LLM 反思蒸馏洞察;整合把实体簇折叠成单条事实 | | 🗄️ 存储自主 | 自管文件后端——storage.root 指向任意目录(Obsidian 库也行);一个可读 JSON 文件即唯一真源 | | 🤝 外部智能体 | 零依赖 CLI、文档化文件格式、令牌门禁 HTTP API、stdio MCP 服务(Claude Code 等) | | 🎛️ 可视化面板 | 时间线/关系/归档三页签 + 可交互力导向图 | | 🪶 零运行时依赖 | 纯 ESM + harness 插件协议——无 zod、无 SDK、无原生二进制 |

🚀 快速开始

从 npm(推荐——钉精确版本)

dsh plugin --profile web add @zheexinn/[email protected]   # 然后重启 dsh web

从源码(本地开发)

// ~/.dsh/profiles/web/package.json
{
  "dependencies": { "@zheexinn/dsh-memory": "link:<仓库路径>" },
  "dsh": { "profile": { "bundles": ["@zheexinn/dsh-memory"] } }
}
cd ~/.dsh/profiles/web && pnpm install   # 然后重启 dsh web

就这些。在「记忆」面板写一条(或让模型调 memory_remember),然后开个新会话问「你还记得什么?」——模型有 memory_recall,且每回合结束时高分记忆自动注入其运行时上下文。

🏗️ 工作原理

flowchart LR
  U[用户回合] --> A[Agent 循环]
  A --> E["turn/end 钩子"]
  E --> X[LLM 抽取<br/>转写 → 候选]
  X --> S[(记忆服务<br/>宿主平面单例)]
  A --> C[上下文组装]
  C -->|"systemPrompt.context<br/>高分记忆"| S
  S --> F[memory.json<br/>唯一真源]
  M[后台任务] -->|"归档 · 反思 · 整合"| S
  P[面板] <-->|"/memory/api/*"| S
  R[外部智能体] -->|"HTTP / MCP / CLI"| S
  R -->|"或直接读写文件"| F

三个平面,一份记忆:

  • Hub 行(宿主平面)——memory 服务单例、自管存储后端、面板与远程 API;
  • Agent 行(智能体平面)——四个模型工具、动态上下文召回、自动抽取、后台维护。默认全局挂载,也可移入 agent preset
  • Client——注册在会话环与设置里的三页签面板。

🧩 记忆生命周期

  1. 摄取——每 N 个完成回合,水位线以来的会话日志渲染成受限转写(保留最新内容);
  2. 抽取——一次辅助 LLM 调用(复用会话自己的 request/header 路由)返回候选数组(类型/内容/重要性/置信度/范围);
  3. 门槛——低于 minConfidence 丢弃;低于 verifyConfidence 打「待验证」(检索分数折半、面板虚线显示);
  4. 合并——同「内容+范围」合并进已有条目而非重复,抬升重要性;
  5. 存储——记录写入 memory.json(临时文件 + rename 原子重写);
  6. 召回——遗忘曲线评分 × n-gram 余弦 × 图谱加权融合排序,高分条目注入每个会话的运行时上下文;
  7. 维护——衰减条目自动归档(隐藏不删、可恢复);反思蒸馏洞察;整合把事件簇折叠成事实;
  8. 可视化——时间线含来源与引用次数;实体卡片说明每个关系的含义;可交互图谱。

⚙️ 配置

# profile cordis.patch.yml
- id: memory-hub
  name: '@zheexinn/dsh-memory'
  config:
    storage:
      root: 'D:/_Tools/Obsidian/memory'   # 默认 ${DSH_HOME|~/.dsh}/storages
    recallTopK: 5
    recallBudget: 1500
    importanceLearningRate: 0.01
    semanticWeight: 0.6
    graphWeight: 0.4
    archiveThreshold: 0.05
    server:                                # 远程 API(默认关闭)
      enabled: true
      token: '足够长的随机串'

- id: memory-agent
  name: '@zheexinn/dsh-memory/agent'
  config:
    recallTopK: 5
    recallBudget: 1200
    extraction:
      enabled: true
      everyNTurns: 1          # >1 即攒批:多个回合合并抽取
      maxInputChars: 6000
      minTranscriptChars: 40  # 琐碎回合直接跳过
      minConfidence: 0.3
      verifyConfidence: 0.6
      maxCandidates: 8
      timeoutMs: 60000
      maxTokens: 1024
    archiveEveryNTurns: 10      # 0 关闭
    reflectEveryNTurns: 10      # 0 关闭
    consolidateEveryNTurns: 20  # 0 关闭
    # 后台 LLM 调用的固定路由(缺省复用会话 request/header 路由):
    # provider: deepseek
    # model: deepseek-chat

每个旋钮都有代码默认值——零配置即可运行。

🗄️ 存储:记忆归你所有

Hub 在 harness 存储中枢上注册自己的文件后端。整个记忆库就是一个人类可读的 JSON 文件

{storage.root}/memory.json        # { unit, global, tables.entries }
  • 默认根目录是 harness 的 storages 目录,现有数据无缝继续;
  • storage.root 指向任意目录——包括 Obsidian 库:文件成为笔记库中可见、可搜索、可版本化的一部分;迁移现有库只需把 memory.json 拷过去;
  • harness 其他域不受影响——只有 memory 搬家;
  • 落盘格式已文档化(docs/external-format.md)且稳定:外部智能体可直接读取,自带 CLI 以与插件完全相同的语义写入(去重合并、软删除、原子写 + 乐观并发保护)。
npm run memory-cli -- list --scope user      # recall / remember / forget / restore / purge / stats / export

🌐 远程访问与 MCP

开启令牌门禁的远程 API(server.enabled + server.token),任何外部智能体都能通过 HTTP 读写记忆:

| 端点 | 用途 | | --- | --- | | GET /memory/remote/stats | 统计 | | GET /memory/remote/list | 列表 | | GET /memory/remote/recall?query=&scope=&top_k= | 融合召回 | | POST /memory/remote/remember | 写入 | | POST /memory/remote/forget | 软删除 | | POST /memory/remote/purge | 永久删除 {id}(不可恢复) | | GET /memory/remote/export | 全量导出 |

自带的零依赖 MCP 服务把这些端点桥接给任何 MCP 客户端:

{
  "mcpServers": {
    "@zheexinn/dsh-memory": {
      "command": "node",
      "args": [
        "<仓库路径>/scripts/mcp-server.mjs",
        "--api", "http://127.0.0.1:3080/memory/remote",
        "--token", "足够长的随机串"
      ]
    }
  }
}

Claude Code 等即可获得一等公民工具:memory_remember / memory_recall / memory_forget / memory_reflect

🧪 可插拔 embedding

默认语义层是零依赖字符 n-gram 索引(中文 bigram + 路径/标识符/版本整词)。任何插件都能在不改本包的情况下替换它:

ctx.provide('memoryEmbedding', {
  // 契约:rank(texts, query) → scores[](与 texts 等长,0..1)
  rank: async (texts, query) => texts.map((text) => similarity(text, query)),
})

失败自动回退内置 n-gram 索引。

🔌 Preset 集成

agent 行默认全局挂载。要限定到特定 agent preset:从全局补丁移除 memory-agent 行,加进 preset 的 cordis.yml

- id: memory-agent
  name: '@zheexinn/dsh-memory/agent'
  config: { recallTopK: 5, recallBudget: 1200 }

memory-hub 行必须留在宿主组合——它是进程单例。

🛠️ 开发

npm test          # 六组行为测试:pipeline / hub / external / vector / graph / mcp
npm run build     # 客户端打包(wire 格式)
npm run smoke     # node 半边加载检查

🗺️ 路线图

  • 面板检索框(关键词 + 语义混合搜索 UI)
  • 参考 embedding provider(本地 sentence-transformers 桥)
  • 跨机部署开箱指引(服务发现、HTTPS)

❓ FAQ

自动抽取会多花 LLM 调用吗? 会——每 everyNTurns 个完成回合一次辅助调用,复用会话自己的模型路由。调大 everyNTurns,或 extraction.enabled: false 只用工具手动写。

远程 API 暴露安全吗? 默认关闭且 Bearer 门禁。仅本机使用最安全;跨机请经反向代理走 HTTPS 并保管 token。

旧记忆会怎样? 插件从不硬删除任何东西:记忆衰减 → 归档(隐藏、可恢复),删除都是墓碑,可在归档页恢复。

能用 sqlite 吗? 自管后端刻意保持单 JSON 文件(它就是外部智能体格式)。sqlite 后端是可能的未来变体,格式文档即迁移面。

📄 License

MIT © 2026 zhang66633 · 安全问题请通过 GitHub security advisory 私下报告。