dsh-instruction-memory

memorytested: passnpmMIT

Standing instructions edited in the DSH settings UI and injected into the system prompt of every subsequent turn.

下载量 / Downloads
3,766
依赖体积 / node_modules
6.36 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

Install

dsh plugin --profile web add dsh-instruction-memory

Sandbox test results

StageResult
1 install✓
2 list✓
3 mount✓
4 boot—

Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).

README

dsh-instruction-memory

在 DSH 设置界面中维护长期指令记忆:保存后自动注入此后每一轮对话的系统提示词。

想先看看界面?在 GitHub 仓库中打开 docs/demo.html,无需安装 DSH,浏览器直接体验真实设置页(内置演示数据)。

安装

dsh plugin --profile web add dsh-instruction-memory

宿主版本必须落在[兼容性](#兼容性)声明的范围内。范围之外宿主会拒绝安装/启动(1.0.14 起,

因为 peerDependencies 已声明);确需强行安装可用 dsh plugin allow-version 授予该精确版本的

豁免,风险自负。

装完重启 DSH,设置页会出现「指令记忆」入口。卸载:

dsh plugin --profile web remove dsh-instruction-memory

从仓库安装(开发)

不让插件市场参与、直接从本仓库检出运行时装用 install.mjs:

node install.mjs                        # 装进"解析出来的那个 profile"
node install.mjs --profile superagent   # 指定 profile
node install.mjs --profile superagent --remove

profile 的解析顺序是 $DSH_PROFILE_DIR → --profile <名字> → $DSH_PROFILE → web。

$DSH_PROFILE_DIR 是宿主给每个子进程导出的"我正在用的 profile 目录",所以在 DSH 的终端里

直接跑会落到当前 profile(这一点与 dsh plugin 不同,后者要求显式 --profile)。目标 profile

里没有 package.json 时脚本拒绝写入,并列出 <DSH_HOME>/profiles/ 下真正存在的 profile

名——早先版本把 profiles/web 写死,装进不存在(或不会被加载)的目录后仍然打印成功。

只由用户本人维护

这份记忆的内容只属于用户。 本插件刻意不注册任何面向模型的工具,也不会主动生成

条目:写入入口只有设置页(以及用户本人直接编辑存储文件),因此不会出现 AI"顺手"给你

记下一条指令的情况。

但这不等于"模型绝对写不进去":存储文件在你自己 UID 下,任何以同一用户身份运行、

具备文件写入能力的进程(包括被你授予 shell 的 agent,以及本 profile 的

danger-full-access)都能直接改它;插件的外部改动监听(fs.watch + 5 秒轮询签名)还会

在下一轮把它当作正常编辑载入。要挡住这条路,请限制 agent 的文件权限,或把存储目录

留在受控位置——本插件的承诺只是"不提供模型工具",不是"阻止同权限进程"。

条目内容由用户输入并被原样注入,本插件不对其做语义判断或自动生成。

组成

文件 · 作用

lib/index.js · Host 半:读取/保存记忆,注册 systemPrompt 段落,暴露同源 JSON 路由

lib/client.js · Client 半:在 settings.section 注册「指令记忆」设置页(手写模块,无需构建)

cordis.patch.yml · bundle patch:把 Host 行插入宿主组合

install.mjs · 开发安装脚本:从本仓库检出安装时,把包链接进 web profile 的 node_modules(junction)、注册 dsh.profile.bundles,并在 profile dependencies 里声明 link:<本仓库路径>(缺这一步插件能跑,但插件市场的「已安装」列表看不到它——市场只读 dependencies);--remove 三步完整回滚,改 profile 前自动备份

contract-test.mjs · 契约测试:驱动真实路由,验证两半之间的响应格式(含配置集、版本历史、源码模式、备份位置)

ui-test.mjs · 设置页行为测试:用一个 ~60 行的 React 垫片真实渲染面板、点按钮/填输入框,再断言注入内容随之变化(不出图、不依赖浏览器)

verify.mjs · 装载验证:按 DSH 的方式加载两半,并逐项断言 memory.schema.json 与代码中的上限一致

smoke-test.mjs · 注入渲染逻辑的单元测试(含「只渲染激活配置集」的隔离断言与 cwd 红线)

host-range-test.mjs · 宿主版本范围契约测试:固定矩阵 × 两种 semver 判定模式,并把 peerDependencies(被执行的那个)、dsh.engines.dsh、dsh.compatibility.dsh 三处声明锁到同一个生成值

lint.mjs · 静态门禁,已并入 npm test:node --check 解析所有随包发布与本仓库运行的 JS 文件,并断言 lib/ 里不出现 @deepseek-ai/* 的包名导入(插件只该通过宿主传进来的上下文对象接触宿主,按包名 import 会把插件钉死在某个安装位置,在 headless / CI / 检出目录里直接解析失败)

live-host-smoke.mjs · 双端冒烟(1.4.8 起宿主有鉴权门,需 --token <启动 token> 换会话 cookie,否则全 401):对正在运行的 web / 桌面宿主各测 state p50/p95、SSE 首事件、注入注册与字符数,并比对两端快照(除 injection.pulls 外须逐字段相同);npm run smoke:hosts,--require-pulls 可把「从未经历真实 Agent 回合」判为失败。刻意不进 npm test——CI 没有桌面端。请求走 Node http 直连,绕开 http_proxy(否则回环请求也会被代理转发,读数虚高)

docs/demo.html · 离线演示页:桩掉 DSH 外壳、加载真实 Client 半渲染设置页(不随 npm 包发布)

memory.schema.json · 手改存储文件用的 JSON Schema(随包发布,并被宿主复制到 memory.json 旁边)

生效方式

  • 始终 条目:无条件遵守。
  • 按需 条目:由模型按相关性自行判断是否适用,不相关时忽略;可填「适用场景」辅助判断。
  • 优先级 高 > 普通 > 低,决定注入顺序。
  • 注入字数上限:超出时按优先级保留,被略过的条目数会在注入文本末尾注明。

上限单位是字符而非 token——按 DeepSeek 官方分词比例约 1 个中文字符 ≈ 0.6 token、

1 个英文字符 ≈ 0.3 token(不同模型分词有差异,实际用量以模型返回为准),上限 40000

字符约合 24000 token。

  • 预算用量可视化:设置页在上限输入框下方显示用量条——「实际注入 x / y 字符(约 z token,

估算)」(token 数按 0.6 系数估算,仅作参考);被上限略过的生效中条目会在列表里逐条

标注橙色「本轮不注入」(悬停可见原因),极端情况下首条被迫截断时标注红色「已截断」。

调高上限或调整优先级后标记实时变化。这些数据只是对注入取舍的展示,不改变注入文本本身;

存储格式不变,旧宿主/旧客户端对新字段一律忽略,互不影响。

  • 标签、筛选与排序:每条指令可加若干标签(回车或逗号添加,最多 8 个、单个不超过 24 字符)。

标签只用于设置页分组与筛选,不会进入注入文本;标签缺失的旧记忆照常加载(等同无标签)。

列表可按标签、生效方式(始终/按需)、启用状态组合筛选,并在「按优先级 / 按更新时间 / 按标题」

之间切换排序;列表排序纯为查看方便,不改变宿主侧的注入顺序。

  • 批量操作:点「批量操作」进入多选,可对勾选条目一次性启用、停用、设置优先级、加标签或删除;

多选与上方的筛选/搜索叠加(「全选」只作用于当前可见条目)。整批修改在宿主侧是单次写入

(只产生一次落盘、一次修订号递增与一次同步推送),全部条目已是目标状态时不写盘;批量删除需确认。

批量的启停/优先级/标签调整不重盖更新时间,因此不会改变同优先级下的注入先后。

「加标签」在浏览器里用原生输入框;桌面版(Electron)不提供 window.prompt(调用即抛错),

此时自动改用面板内的行内输入框(回车提交、Esc 取消),功能不受影响。

  • 用户形象:除了"要求 AI 怎么做"的指令,你还可以记录关于你本人的信息(身份背景、喜好、性格、

长期追求等),每张形象卡片可单独勾选「使用该形象」——可以一个都不用、只用一个、或同时勾选多个

(多个会作为同一画像的不同侧面综合)。启用后,形象段会以「## 关于用户(用户形象)」为抬头注入在

指令块之前,抬头明确把它限定为"仅供调整回答侧重":AI 应在保证回答正确、完整、客观且扣题的

前提下据此调整解释深浅、详略、举例与建议方向,不得为了迎合而改变事实、省略风险提示或偏离问题本身,

无关时直接忽略。形象不是让 AI 扮演的角色。形象段与指令共用同一个注入字数上限:

形象优先占用,指令只拿剩下的余量(早期版本让形象完全绕过预算,十几个填满的形象能在指令预算还没被

考虑之前就塞进约 5 万字符)。形象自身另有 4000 字符的硬上限,超出部分按顺序截断并说明。

页面上的用量条同时计入形象与指令,所以它显示的比例就是宿主真正用来裁剪的那个数字。

总开关关闭时形象与指令一起停用。

总开关关闭时,该提示词段落(指令与用户形象)整个注销,系统提示词与未安装本插件时逐字节一致;

总开关开启但没有任何生效指令、也没有启用形象时,段落同样不出现。

临时静音(暂停注入一段时间,F7)

总开关旁提供「暂停注入…」:30 分钟 / 1 小时 / 到今天结束(本地时区 24:00)。暂停期间

指令与用户形象都不注入,系统提示词与「未安装本插件」逐字节一致;到期由插件内的

宿主侧定时器自动恢复——无需用户操作,也不产生写盘(存储文件与修订号不变)。暂停

状态保存在存储文件的 disabledUntil 字段里(仍是格式版本 2 的可选字段,缺失即未暂停),

因此跨重启保留。手动切换总开关会立即清除暂停(显式开关优先于定时)。设置页在暂停中

显示剩余时间倒计时,并可随时「立即恢复」;倒计时只是展示,权威判定始终在宿主快照

(injection.muted)里。到期判定与注入渲染都是可注入时钟的纯函数(isMuted、

planInjection(data, now)),相同输入永远得到相同字节。

存储

记忆保存在 DSH 数据根目录下(设置页显示折叠后的路径:Windows 为 %USERPROFILE%,macOS/Linux 为 ~;真实绝对路径只用于读写):

<DSH_HOME>/instruction-memory/memory.json              # DSH_HOME 默认为 ~/.dsh
<DSH_HOME>/instruction-memory/memory.json.bak          # 上一版(崩溃恢复用)
<DSH_HOME>/instruction-memory/memory.schema.json       # 手改用的 JSON Schema 副本
<DSH_HOME>/instruction-memory/history/                 # 版本历史快照(见下文 F14)

路径优先级与官方 @deepseek-ai/dsh-home-paths 一致:显式 $DSH_HOME → ~/.dsh。

空白的 $DSH_HOME 视为未设置,绝不会退回当前工作目录——否则用户换个目录启动

DSH 就会得到第二份空记忆,看起来像"记忆消失"。相对的 $DSH_HOME(如 ./data)会在

启动时按当前目录解析为绝对路径,因此设置页显示的始终是完整路径。

插件创建 instruction-memory/ 与 history/ 时按 0700 建目录(只给当前用户;umask

只会让它更严):这些文件里存的是会被注入每一轮对话的长期指令,同一台机器上的其他用户

没有理由读得到。

1.0.0 之前的构建曾把数据写在宿主进程 cwd 下(.dsh-instruction-memory.json)。
首次启动新版本时会自动迁移到上述位置,并把原文件改名为 *.migrated 保留。

当前存储格式为版本 2(1.1.0 及更早写的是版本 1,见下文「多情境配置集」)。

两者都能载入:版本 1

…(truncated)

Rendered from the README published on npm. Formatted only, not edited.

Versions

Published on npm::36,最后更新 2026-11-05

Links

GitHub · Homepage · npm

Same category