DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

Yang-Yin734 /

Yang-Yin734/dsh-long-term-memory

Verified

DSH 设置页的「长时记忆」盒子:填一次,之后每个新会话都带着它。0.3.0 起可一键把草稿细化成完整需求说明——原文要求逐条保留、模型补充标为「推断」可删、未指定的维度单列,采用 / 换一版 / 不改都由你决定。 · Long-term memory box for DeepSeek Harness settings, plus an opt-in pass that expands a rough note into a detailed requirement sheet without moving your meaning.

★ 1 Stars0 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHubProject homepage
READMESource: main@c670af6f

dsh-long-term-memory · 长时记忆

在 DeepSeek Harness 的设置里放一个输入框。填一次,之后每一个新会话、每一个工作区、每一次重启,它都在系统提示词里。

0.3.0:写完还能点「细化需求」——模型把你随手记的一两句话写成一份完整需求说明(需求概述 / 具体要求 / 禁止与边界 / 推断补充(可删) / 未指定(建议你补充))。原文要求逐条保留,模型自己补的每一条都带「推断:」前缀、可整段删掉,采用 / 换一版 / 不改都由你决定。

一个给 DeepSeek Harness(DSH) 用的双半插件(host + browser),补上 DSH 原生的一个缺口:跨会话的长期偏好没有地方填。

~/.dsh/AGENTS.md 管的是「指令与规则」,改它要动文件、要懂目录;这个插件把同一件事搬进 设置页 → 长时记忆,一个文本框、一次保存。

English


它解决什么

场景 没有它 有它
每次都想让 agent 用简体中文、别开场客套 每个新会话重说一遍 填一次,永久生效
常用目录、构建命令、代码风格约定 写进每个仓库的 AGENTS.md,一个仓库一份 一处填写,全局生效
想让 agent 记住「先给可回滚命令」这类硬规矩 忘了就忘 系统提示词里常驻
临时换一套偏好做实验 改文件、还要记得改回来 设置页改完点保存,随时清空
写得太散、重复、语序乱,但不想重写 自己重打一遍,或者就这么发出去 一键细化成需求说明,先看候选再决定

界面

设置侧栏多出一栏「长时记忆」(Long-term memory):

┌─────────────────────────────────────────────────────┐
│ 长时记忆                                             │
│ 这里填写的内容会作为系统提示词的一部分注入到           │
│ 之后每一个新会话(跨工作区、跨重启)…                  │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 我的名字是 YG,回复一律用简体中文,不要开场客套。  │ │
│ │ 常用工作目录 D:\work,前端构建用 pnpm build。      │ │
│ └─────────────────────────────────────────────────┘ │
│ [细化需求]  原样保留你写的要求,缺的补上、不确定的标注… │
│ ┌─ 细化结果 ── 第 1 版 · 详略平衡 · deepseek-flash ─┐ │
│ │ ## 需求概述                                       │ │
│ │ 用户要求中文回复,并记住名字、工作目录与构建命令。  │ │
│ │ ## 具体要求                                       │ │
│ │ - 回复一律使用简体中文。                          │ │
│ │ - 不要开场客套。                                  │ │
│ │ - 前端构建统一使用 pnpm build。                    │ │
│ │ ## 禁止与边界                                     │ │
│ │ - 不要开场客套。                                  │ │
│ │ ## 推断补充(可删)                               │ │
│ │ - 推断:同一会话内不重复确认已记住的偏好。         │ │
│ │ ## 未指定(建议你补充)                           │ │
│ │ - 代码风格(缩进/引号):影响你粘贴回的片段。       │ │
│ │ [采用这一版] [换一版] [关闭]                      │ │
│ │ 原文要求逐条保留 · 含 1 条「推断:」内容,可自行删掉│ │
│ └─────────────────────────────────────────────────┘ │
│ [保存]  [撤销修改]                    有未保存的修改   │
└─────────────────────────────────────────────────────┘

保存后状态行变为「当前内容已生效」——text 字段是 volatile 的,host 侧立刻重算系统提示词,不需要重启;下一个新会话就带着它。

细化需求(0.3.0)

0.2.0 的「自动完善」只重写措辞,对随手写的一两句草稿没多大帮助——所以 0.3.0 换了方法:把草稿扩写成一份完整、可执行的需求说明,同时保证不动你的原意。

五节结构

小节 内容规则
需求概述 三到五句话,把你的意图、目标、适用范围说清楚
具体要求 逐条列出你写过的要求,一条一行、可执行
禁止与边界 逐条列出你写过的禁止项与硬边界,否定词原样保留
推断补充(可删) 模型不得不补的实现细节,每行以「推断:」开头,可以整段删掉
未指定(建议你补充) 你没提但会影响行为的维度,只列维度 + 为什么重要,不替你选答案

中间两节只能出现你写过的东西;新增内容一律进「推断补充」,所以「哪句是我的、哪句是模型猜的」一眼分得开。

流程

  1. 写完草稿,点 细化需求。
  2. host 用当前默认模型生成五节说明,回到文本框下方,标注版本号、深度与模型名。
  3. 你的三个选择:
    • 采用这一版 —— 只把候选填进输入框,配置仍未变;再点 保存 才真正生效。
    • 换一版 —— 用同一份原始草稿重新生成(上一版会作为「别重复」的参考一起送去),候选不会一版一版地漂移。
    • 关闭 —— 丢掉候选,草稿原封不动。
  4. 随时可以直接改字、撤销修改,不用管候选。

「换一版」换的是深度,不只是同义句

版本 深度
第 1 版 详略平衡,五节齐全
第 2 版 更细:每条要求补一句「怎么算做到」或一个具体场景
第 3 版 更紧凑:删掉解释性文字,每条压到一句
第 4 版起 平衡 → 更细 → 更紧凑 循环

为什么它不会偷偷改掉你的意思

保障 做法
提示词硬约束 8 条编号约束:逐条保真;不得弱化否定(不要 / 禁止 / 必须 / 只能 / 一律);不得反转或替你选型;新增内容只能进「推断补充」并带 推断: 前缀;专名与数字原样;语言跟随原文;只输出五节;详细但不说废话。
自动复核,不盲信模型 候选返回前逐项对账:草稿里的数字/编号、限定词、五节结构是否齐全,并统计有多少行是模型的推断——全部列在候选下方(warn 色)。
两道人工闸门 候选只进输入框,落盘必须你按「保存」;不满意一秒钟「换一版」或关掉。
原文不变式 每次请求携带的永远是原始草稿,候选之间不迭代,所以不存在「越改越远」。
可见的失败 原文为空、超长(>8000 字)、没有可用模型、超时、上游限流(如 RATE_LIMIT)都会在页面内说明原因,编辑与保存照常。

降级行为

情况 表现
部署没有 LLM 服务 / 没有可用路由 「细化需求」报出原因;文本框、保存照常
host 是旧版(没有 longTermMemory/refine) 按钮禁用并提示「插件版本较旧」,其余功能不受影响
设置为只读 输入框、细化、保存全部禁用

安装

方式 A:DSH 商场(推荐,若已收录)

在 Harness 里打开 设置 → 插件市场,搜索 long-term memory 或 dsh-long-term-memory,一键安装。

方式 B:从 GitHub 手动挂载

# 1. 放到插件目录
git clone https://github.com/Yang-Yin734/dsh-long-term-memory.git \
  ~/.dsh/plugins/dsh-long-term-memory

# 2. 让 profile 能解析到它(实体复制,不要用符号链接)
cp -r ~/.dsh/plugins/dsh-long-term-memory \
      ~/.dsh/profiles/desktop/node_modules/dsh-long-term-memory
  1. 在 ~/.dsh/profiles/desktop/package.json 的 dependencies 里加一行:
"dsh-long-term-memory": "file:C:/Users/<you>/.dsh/plugins/dsh-long-term-memory"
  1. 在 ~/.dsh/profiles/desktop/cordis.patch.yml 末尾加:
- insert:
    - id: long-term-memory
      name: 'dsh-long-term-memory'
      config:
        text: ''
  1. 重启 Harness。host 不 watch 这个 patch 文件,新增插件行必须重启才生效。

升级只需要换掉 client.js 与 lib/index.js(profile 的 node_modules 里也要换),然后重启。0.3.0 的 endpoint 与参数签名与 0.2.0 相同,旧 host 配新 client 也不会炸。

方式 C:plugin_manager 工具

若你的 DSH 版本带 plugin_manager,直接用 action: install_bundle、target 指向包目录即可,返回 application: applied 表示已 live。

配置

字段 类型 默认 说明
text string(volatile,textarea) "" 要注入的正文。空字符串表示不注入任何内容(不是注入空标题)
refineProvider string "" 细化用的 provider;留空跟随 agent-default-model
refineModel string "" 细化用的模型;留空跟随 agent-default-model。两个都填才覆盖路由
refineTimeoutMs number 90000 单次细化超时,5000–300000
refineMaxTokens number 3072 单次输出上限,128–8192(细化结果比原文长,别调太小)

路由解析顺序:refineProvider + refineModel 双填 → agentDefaultModel.currentSelection() → 第一个可用 provider 的首个模型。

保存会写回 profile 的 cordis.patch.yml(insert 建条目 + 顶层同 id 覆盖行,属合法层叠)。值随之持久化,重启后仍在。

工作原理

host 半(lib/index.js)

ctx.systemPrompt.section({
  name: 'long-term-memory:user-text',
  order: 10250,          // 紧随一方 persona 后缀(10200)之后
  interpolate: false,    // 用户文本里的 {{…}} 保持字面,不参与插值
  text: () => body === '' ? '' : `${HEADER}\n\n${body}`,
})

三个要点:

  1. interpolate: false —— 用户可能写 {{...}},若参与插值,未解析的引用会让整个提示词组装抛错,把会话直接打挂。
  2. order: 10250 —— 排在一方部署 persona(10200)之后,保证只改长时记忆时,前面那一大段前缀字节不变(prompt cache 友好)。
  3. 空则返回 '' —— DSH 的 renderPrompt 会 filter(t => t.length > 0),空段不会留下空标题噪音。

host 半的 refiner(0.2.0 起,0.3.0 换语义)

ctx.provide('longTermMemory', new LongTermMemoryRefiner(ctx, config))
// Typert Remote:endpoint longTermMemory/refine,签名 refine(draft, variant, previous, signal)
// 返回 { text, source, variant, provider, model, elapsedMs,
//        checks: { missingNumbers, missingKeywords, missingSections, inferred } }
  • 走宿主 ctx.llm.stream({ provider, model, messages, system, maxTokens, signal }),不传 temperature(部分推理模型/适配器会拒绝该字段),也不带 sessionId / purpose,因此不会污染会话记录。
  • Remote 标记按协议常量手写(@deepseek-ai/dsh-typert-protocol/remote-methods → { version: 1, methods: [{ method: 'refine', invocation: { kind: 'direct' } }] }),所以 host 半只 import '@deepseek-ai/schemastery',无 host-only 依赖、无构建步骤。
  • 错误以 isDSHRemoteError 结构跨线,code 原样透传:REFINE_EMPTY_DRAFT、REFINE_DRAFT_TOO_LONG、REFINE_NO_MODEL、REFINE_TIMEOUT、REFINE_EMPTY_RESULT、REFINE_LLM_FAILED,以及上游的 RATE_LIMIT / AUTH 等。

browser 半(client.js)

  • 从 slots / locale / configForms 三个服务取能力;
  • configForms.whileServed(['long-term-memory'], …) —— host 真的服务这个条目时才挂 UI,没装 host 半就什么也不显示;
  • 向 settings.section 槽注册一个分区(id: 'long-term-memory', order: 60);
  • 表单是 SettingsFormModel + 一个 settingsTextField('text'),inject() 返回 { hooks: { longTermMemory: store }, edit, save, discard, resetField, refine },框架把 hooks.longTermMemory 转成组件里的 props.useLongTermMemory;
  • 调用细化:ctx.get('connection').rpc.call('/api', 'longTermMemory/refine', { args: { draft, variant, previous? } })。connection 用 ctx.get 软取,旧 host 或测试环境缺这个服务时只禁用按钮,不炸页面。

兼容性

项目 要求
DSH 0.2.x(桌面版 / web 版;依赖 settings.section 槽、configForms、volatile 配置;0.2.0 起的细化还依赖 ctx.llm)
cordis ^4.0.1
Node ≥ 18(仅用于包管理,插件本身跑在 DSH 里)
平台 所有 DSH 支持的平台(纯 JS,无原生依赖)

已知限制

  • 改了 CSS 或 client 代码要整页刷新(Ctrl+R),host 侧代码改动要重启 Harness。
  • 文本是明文存在 profile 的 cordis.patch.yml 里 —— 别往里写密码、token、私钥。
  • 只注入系统提示词,不做检索、不占 token 预算管理;请自行控制长度(建议 < 2 KB)。
  • 不要和别的「往系统提示词里塞内容」的插件同时使用 —— 两边都会注入,容易重复。
  • 细化是同步等一次模型调用(默认上限 90 s),不流式显示过程;期间按钮进入「细化中…」。
  • 「未指定」一节只列维度不填答案,细化后的文本会比你写的长不少;不想要就直接关掉候选,或采用后手动删掉那两节。建议采用前扫一眼「推断补充」里有没有你不认同的猜测。

开发

.
├── client.js            # browser 半:设置页分区 + 细化候选面板
├── lib/index.js         # host 半:systemPrompt 段 + Config + refiner Remote
├── cordis.patch.yml     # bundle patch:向组合树插入插件条目
├── package.json         # dsh.bundle.patch / dsh.client 声明
└── LICENSE

自检(不需要装进 DSH):

node --check client.js
node --check lib/index.js

更多见 CHANGELOG.md。

踩过的坑(写在这里,省你一次调试)

  1. 别把前景色变量当背景色。 第一版主按钮写了 background: var(--dsw-alias-label-primary); color: var(--dsw-alias-bg-l1, #fff) —— --dsw-alias-bg-l1 不存在,var() 静默回退成白色,深色主题下直接白底白字,按钮看起来「是空白的」。
  2. edit 工具改 cordis.patch.yml 前必须先读,否则报 file has not been read;用 PowerShell here-string 写中文会变 闀挎椂璁板繂(写文件请走 UTF-8 编辑器 / Node 脚本)。
  3. 新增插件行不重启不生效。 host 不 watch patch 文件。
  4. profile 的 node_modules/<pkg> 必须是实体目录,用 junction/符号链接会让 import '@deepseek-ai/schemastery' 解析失败。
  5. 0.2.0 的 Remote 必须"活"到 gateway 能枚举:服务实例上要有 typertRemote = { service, serviceKey, namespace }(三者与实例一致),原型上要有 @deepseek-ai/dsh-typert-protocol/remote-methods 标记,且参数名只能是简单标识符、取消参数叫 signal 且放最后,否则要么 gateway/signature-invalid,要么根本不被 claimsEndpoint 认领。
  6. 抛错要带 isDSHRemoteError,否则 gateway 的 rpcFailure 会把它折成 gateway/internal,界面上只剩「未知错误」。

隐私

仓库内不含任何账号、密码、API key、token、私钥或机器相关绝对路径。插件本身不直接发起网络请求;「细化需求」只在你按下按钮时,通过宿主已有的模型路由(你配置的 provider)发送一次请求,内容就是输入框里的草稿。

License

MIT © Yang-Yin734

—/ 5

No ratings yet

Verified DSH bundle

Commit c670af6fddbd

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout