dsh-memory-context-lab
按 DSH 会话启用的上下文降温插件:已执行完的操作沉入隔离冷库,攒批归档保持前缀缓存命中
- Stars
- 3
- Language
- JavaScript
- Created
- Oct 10, 2026
- Updated
- Oct 19, 2026
Introduction
dsh-memory-context-lab
当前版本 0.13.1(单引擎)。
按 DSH 会话 启用的上下文管理插件:基础是上下文降温(把执行完的操作沉入隔离冷库、用极小回执替换),0.9.0 起扩展全历史记忆上下文与计划先行。安装、会话命令、图形入口与清理卸载的唯一操作说明都在这里。
它做什么、不做什么
做:归档完成的操作;保留最近 N 个操作一直生效(更旧的攒够批量阈值就归档);按相关度回注归档要点;随时恢复原文、清空本会话隔离数据。
不做:增删模型可见的工具(工具集一变就作废整段前缀缓存,省钱变赔钱);改写 DSH 的 append-only 事件日志(归档走宿主表层替换,原始事件可恢复、可审计、可回放)。
缓存纪律
在位置 i 替换内容,会让 i 之后一切按未命中价重算。插件据此一批做够(批次数才是代价来源)、回注只落在批次尾部、工具集恒定。见工作区 docs/架构与边界.md 的「前缀缓存纪律」。
已核验范围
| 项目 | 值 |
|---|---|
| DSH Desktop | 0.2.0-rc.2 |
dsh-memory(可选) | 0.8.1;缺席时独立模式运行 |
| 冷库 | 复合后端:灵枢子进程(T2)/ 本地 Node store(T1) |
| 会话目录 | $DSH_HOME/.memory-context-lab/sessions/<session-id 的 sha256 前 24 位>/ |
| 真实灵枢保护 | 启用期间按会话抑制 dsh-memory 的自动读写(不改动工具集) |
| 依赖的宿主接口 | agent/pre-step、session.surface、session.append、requestHeader()、requestContext()、tokenMeter、llm、sessionProjections、commands;可选 planMode(缺失时如实降级)。详见工作区 docs/架构与边界.md |
冷库不可用不阻止启用(T1 兜底):归档/回注失败关闭;占用率缺 requestHeader() / tokenMeter.measure / contextWindow 时失败关闭,原因见 status / dry-run。
使用
唯一命令是 /memory-lab(0.13.1 起 v1 引擎与 /memory-lab2 已删除)。日常面:
/memory-lab on | off 启用 / 停用(停用保留冷库,释放投影所有权)
/memory-lab status 引擎状态、记录数、最近动作、占用率、单批释放上限、成本账本
/memory-lab restore 恢复全部可恢复回执的原文,引擎保持启用(不停用)
/memory-lab now | dry-run 走一次「测量→门禁→提交→替换」;dry-run 零副作用
/memory-lab read <记录ID…> 回读原文(精确 ID / 冷节点基名 / callId 均可)
/memory-lab set <键> <值> auto | recall | autorestore | batch | retain | readlease | pressure | protect |
fullhistory | compress | compressmodel | sharel2content | planfirst
/memory-lab card | cost 工作状态卡 / 成本账本(都是顶层子命令,没有 debug 分组)
/memory-lab recall <查询词> · verify | mark-stale | relations | history | working-set | index
/memory-lab forget preview|apply|undo|status · compress preview|run|status · expand <凭证ID>
/memory-lab fork <子会话ID> | fork-status | fork-reset <子会话ID>
/memory-lab clean confirm delete-session 丢弃本会话隔离冷库(不可撤销;须先 off)
/memory-lab help 本帮助(按「生命周期 / 回读检索 / 证据 / 遗忘 / 压缩 / 迁移 / 设置」分组)
模型可见的只读工具是 memory_lab_recall(record_ids=[…])——回执的「可回读」行直接给这个调用,照抄即可。
0.13.1 不兼容:/memory-lab2 已删除;旧会话目录 sessions/<key>/state.json 不再被读取
(不删不迁移)。已归档原文仍在磁盘,确认不需要后可手动删除 $DSH_HOME/.memory-context-lab/sessions/。
层级卡脱敏与成员级排除(0.11.0)
卡片默认不复制正文:摘录类值渲染成 (正文摘录未共享),只留 entity、属性标签、极性/关系标签、来源 ID 与
expand 入口;结构化属性(退出码、测试摘要、版本号)照常保留。set sharel2content on 才放摘录(默认 off、失败关闭)。
成员级排除:一条成员被遗忘不再废掉整组——被遗忘者排除出参与集,其余照常压缩;全排除仍整组失败关闭。细节见工作区 docs/降温模式.md。
全历史记忆上下文(v2 模式开关)
/memory-lab set fullhistory on 后,插件切换为全历史模式:完整留下 system 头、全部人类用户消息、退热凭证本身与计划工件;其余沉入隔离 ArchiveStore 并自动启动隔离灵枢后端、按批增量同步索引(插件来源不进索引、不被回注)。「保留最近操作」失效(面板变灰),去留由活跃证据保护层(protection.mjs,与降温管线共用)裁决;软保留受 set protect <预算>(默认 32768)与 TTL 约束。
计划先行(planfirst)
打开后,全新对话第一条消息前自动进入 DSH 计划模式(服务可用走服务,否则落账 plan/mode):AI 先产出计划,用户批准的瞬间自动启用降温(免敲 /memory-lab on)。计划期间降温/回注/工作状态卡挂起(手动命令仍可用);计划全文终生保留,不可退热。已有历史的会话不自动进入(提示 /plan);缺投影时如实报错。插件级默认 planFirst: true,可按会话覆盖。
关闭即退出(rc.5):set planfirst off 同时退出本会话仍处 active/pending 的计划模式。
图形入口与设置:composer 权限控件右侧的「降温」触发器(同一套设置与动作);状态、全历史、计划先行三行摘要与最近一次输出显示在弹层底部。全局默认在 设置 → 组件 → 「记忆上下文」。
停用或归档都会把会话送回正常。 /memory-lab off 或面板拨关都走停用路径(先恢复原文,再解除抑制、删隔离目录);关「全历史」同样先恢复再翻位。恢复放不进窗口时如实拒绝(原文留冷库可回读);仍有未恢复回执时不删。插件只清理 $DSH_HOME/.memory-context-lab/ 自有数据,从不写真实灵枢,也不改写会话日志与命令审计。
单一触发线怎么算
「保留最近 N 个操作」一直生效,只受批量阈值约束(窗口外攒够 batch 个才提交一批);硬保护只有 system 指令节点与最新用户消息。提交按相邻性切段:受保护/不够格/冷写失败的单元会切段,回执 N 可小于阈值。
安全边界
- 归档前正文写入隔离冷库并回读校验 hash;失败/缺失/hash 不符一律保留原文并报出阶段。超过单节点上限时按码点分块,每块校验后再校验整篇。
- 回执文本只由稳定标识符构成,逐字节稳定,不扰动缓存;归档是表层替换,
restore按原字节写回、可逆。 clean在仍有未恢复回执时拒绝删除;冷库删除只能删本插件自有目录,且拒绝含链接的路径。- 并发与持久化:第二个写句柄得
ELOCKED(15s 心跳 / 60s TTL / stale 接管,只读不取锁);fsync 只覆盖原文、事务、manifest、engine 与 disposition,派生缓存只保证原子替换可重建。锁是互斥而非事务,跨文件读改写仍靠 revision CAS 与失败关闭。
安装与卸载
插件已作为 bundle 安装在 desktop profile;改宿主侧源码需重启 DSH,改 src/client.js 刷新页面即可。
卸载:plugin_manager remove_bundle dsh-memory-context-lab
清数据:删除 $DSH_HOME/.memory-context-lab/(或在每个会话执行 /memory-lab clean)
验证
npm run test:all # 97 套逐套汇总(推荐)
npm test # 与 test:all 同一批套件,失败即中断
npm run probe:host # 宿主 schema 校验(需 DSH_ASAR;无参数 SKIP)
npm run probe:revert # 回退场景,确认对应测试会失败
npm run probe:lingshu # 隔离灵枢写入健康探测;不可用如实报环境原因
npm test 第一项是 entry-coverage:比对磁盘 test/*.test.mjs 与 scripts.test 链,防止「写了测试却没接线」。0.13.1 全套 97 套(全通过、0 跳过;Node v24.19.0)。
沙箱宿主里
%TEMP%可能不可写(mkdtemp报EPERM):环境限制,非缺陷;把TEMP/TMP/TMPDIR指到可写目录。FakeSession按宿主真实折叠规则实现校验;契约忠实度见工作区docs/验证与评估.md。