Repository navigation
Releases
v0.9.0 — 记忆主管全链 + 健康层前台提示 + 尾部注入改替换
自 0.8.0 起:
- 记忆主管全链:线程化收排(思维链保持)、四块提示词组装(含导演指令到期判定)、append-only 硬闸与工具描述双版本、看门狗/失败逃生舱、首轮 notes 分档、dryRun 移除
- 健康事件层:全流程失败落账 + 面板故障档 + 前台 toast(唯一 SSE 推送)
- 尾部注入改"替换":简报/index 尾注/PHI 不再逐楼叠加(surface 替换)+ 手术清扫端点(幂等、重跑即孤儿认领)+ 首楼认领(fork/重启自愈)
- 查看器:surfaceOp 读事件根——被替换的行不再冒充活行
- 摘要删除迁主管档;每行删除按钮;面板页签重排;故障档可达性修复
v0.8.0 — persona §0 + 压缩面板重构 + memory_write 维护姿态 + 压缩自愈修复
自 v0.7.0 以来(详见 CHANGELOG):
persona / 行为
- §0 每轮强制读取 index.md(置于人格头部,未读不落笔)
- 「思考从简」:工具思考只留要点,⛔ 复述检索原文
- memory_write 描述重写:维护姿态前置——一场一段、过时信息当场删、大整理用 overwrite
压缩
- 面板重构:保留比(retainPercent)与阈值平级、各自独立保存;步长 5 对齐取消(自由输入);usePanelThreshold 开关退役(面板数值恒生效)
- 修复:span 只剩旧 checkpoint 时不再产出空摘要顶掉真浓缩;compaction/summary 账本行不再冒充对话行
面板 / 检索
- 新增 POST /retrieval/models(面板一键抓取嵌入/重排模型清单)
- 提示词查看器按真实请求面渲染(消费 compaction/prune 与 surfaceOp.replace,含修剪标记与徽标)
v0.7.0 — 楼层清单改版 + 每轮折叠历史工具结果 + 查看器真实请求面 + 模型列表抓取 + persona §0
自 v0.5.2 以来的主要变更(详见 CHANGELOG):
- 楼层清单改版:自编序号、倒序窗口、回执、改动下钻
- 每轮折叠历史工具结果(toolCollapsePerTurn)+ 提示词查看器渲染真实请求面
- 「向量检索 API」卡新增抓取模型列表(POST /retrieval/models)
- persona 新增 §0 每轮强制读取 index.md
- 折叠模块 mt-compaction-rp 随预设目录分发
v0.5.2 - v3 external composition consumer (composer + panel, off by default)
v0.5.2 —— v3 外部组合消费端(组合器 + 面板,默认关)
Consume the Tavern v3 external composition API. Off by default.
⚠️ v3 目前只活在 Tavern 的候选分支(codex/prompt-composition-api-v3@92d5924,未合并未发布);
正式版 2.2.0 上/pmp-dsh-tavern/api/v3/*是 404 —— 本插件会如实降级(GET /v3回TAVERN_V3_UNAVAILABLE)。
开着这个组合器才接管装配;关着与 0.5.0 完全一样。
Added
- v3 组合器(
lib/v3-composer.js):经 Cordis 服务pmpDshTavernPrompt注册一个同步组合器
(owner 默认dsh-memory-archive)。会话被显式切成external后由我们产出命名段:卡字段
(system-prompt / description / personality / scenario / message-example)、本轮命中的世界书条目、
后置指令、仅首轮的开场、一行[external-composition owner=… v=…]来源标记 GET /v3:capabilities + 本会话 mode + sources 摘要(卡 id/名、开场序号与语义、各字段字数、
世界书计数、suggestedCallConfig、revision)+ 组合器状态(含needsHostRestart)。⛔ 只回投影,不回卡片正文POST /v3/mode:显式切 builtin/external(先读 revision 做 CAS;必须confirm:true;409 的两种原因如实提示)- 维护抽屉里的「v3 外部组合」面板:上面这份投影 + 三个显式动作(启用我方组合器 / 切到 external / 切回 builtin)
- 两套自检:
_selftest-v3-composer.mjs(18 项)、_selftest-v3-panel.mjs(8 项),各含反证
Notes
- ★ 三个只有真机才暴露的集成陷阱(各有自检钉住,也已回帖上游):
- 段文本里的
{{名字}}会被 DSH 插值(只认provider/model/cwd)⇒ 卡片示例里的{{user}}让整轮直接失败;
Tavern 把卡原文原样交给组合器 ⇒ 宏由我们负责(用runtime.macroContext展开;解不了的中和;畸形嵌套兜底) - 段对象只许有
{id, text}两个键:多一个键就422 OUTPUT_INVALID,而报错文案不指向真因 - 世界书审计的
entryId是裸 uid(字符串或数字),loreEntries[].id却是全名 ——
只按一种查会一条都命中不了且不报错(静默少注入)
- 段文本里的
- 默认关(
config.v3.composer.enabled=false):v3 是"换活法"不是修 bug。改这个开关要重启宿主 - 组合器走软注入(
ctx.inject([...], cb)):硬inject的插件在 Tavern 被卸载后会让整个 Host 起不来 callConfig默认不回传(上游那一问未定前的保守选择)
Known gaps
extensions.depth_prompt没进装配(内置会按 depth 插进消息历史;v1 需要 DSH 侧的插入能力)- ST 完整 marker/宏策略、
prompt_order重排、世界书 token 预算裁剪:不做(与上游示例同档的诚实边界)
Verification
- 全量门 41 套全绿;组合器 18/18、面板 8/8、client 72/72;隐私扫描 106 文件 / 0 命中
- 沙箱端到端(独立
DSH_HOME+ 候选包 + 本机假 provider 落盘真实请求):capabilities.composers=["dsh-memory-archive"];
切 external 后真实请求的新装配就是我们那 9 段(含命中的<st-world-info>与仅首轮的开场),
traceassembly.composition.owner=dsh-memory-archive;第二轮不含开场;0 失败轮次 - Tavern 缺席:宿主照常启动,
/v3如实回TAVERN_V3_UNAVAILABLE
v0.5.0 - viewer field notes, RP scope suppression, template apply
v0.5.0 —— 面板侧收口:字段来路说清 + RP 遮蔽宿主定位段 + 模板「应用」
Viewer field notes, RP scope suppression, template apply.
⚠️ 诚实边界:遮蔽作用在预设作用域,只对新开的会话/周目生效(已在跑的会话留在旧一代装配);
面板侧的注释、灰标、标蓝刷新即生效。
Added
- RP 遮蔽宿主定位段(预设模块):
preset-modules/rp-suppress-host-sections.js—— 在 preset 作用域里把
harness:source(10000) /app:web-surface(10100) /context:file-reference(900) /
ui:deliverable-file-references(9000) 注册成同名空文本段(上游systemPrompt.section()契约:
作用域内同名段遮蔽全局段;上游没有「注销别人注册的段」的 API)。order 取getSectionOrder
⇒ 只换内容不换位置;逐段try/catch、整体绝不抛(抛 = 预设挂不上 = 开不了周目) - 地图的字段注释表:按真机实测补齐 18 条,逐条写清「来源 + 作用」;上述 4 段另写清
「RP 模式已禁用 ⇒ 占位、不会出现具体内容」,行上加灰标「RP 遮蔽」(仅当该段确实 0 字)。
这几行照常逐行给出 —— 每段占一个 order,不折叠、不隐藏 - 工具段的两个通道:
tool:*行与抽屉标蓝药丸,并写明 ① 本段 = system 里的说明与纪律
② 请求的tools字段 = 它的 JSON 定义 - 自动收纳:「绑定」门槛(只有绑定过的会话才自动收纳)+ 失败如实播报落
<storageDir>/auto-collect.json(面板顶栏标红) _selftest-rp-suppress.mjs:遮蔽模块行为自检(8 项,含「把 text 改成非空则判据必红」的反证)
Changed
- 模板卡:压缩指令的「保存」改成「应用」,直接用
/agent/apply写进预设
(writable候选过滤 + 应用回读 + 失败带 hint);「收纳占位」卡改只读(没有可写目的地);
撤掉多余的⚠️ 提示块与随之而来的空框 - 段归属收敛成一张表:按段名前缀认 + 精确名覆盖(
rp:policy=上游 pmp-dsh-tavern、
rp:storyAnchor/rp:firstRound/dma:echo=本插件、state:card=本插件子包 state-bridge),
表里不许写 order 数字(数字一律来自捕获) - 导入:新增
lib/import-apply.js(导入应用路径)
Fixed
- 服务端错误体解析:
{ok:false,error:{code,message}}以前把整个 error 对象当成消息 ⇒ 现在取error.message - 注释里残留的旧口径(旧版地图把这几段折叠成一行汇总;现行是「字段照给 + 注释说清」)已清干净
Notes
- 遮蔽的生效范围:新会话 / 新周目;已在跑的会话里那几段仍有内容 ⇒ 面板不会给它加灰标(说真话优先)
- 自检:39 套全绿(含新增的
_selftest-rp-suppress.mjs) - 安装:下载下面的
dsh-memory-archive.tgz解包到插件目录(包内package/…,与 0.4.0 同一种打包方式)
v0.4.0 - services and v3 read-path fixes
v0.4.0 —— 服务端能力补齐 + 三处「读不到」的真机 bug 修复
Services + three real-machine read-path fixes.
Added
- 收纳执行器 A1/A2(
/collect/targets|plan|apply|scan|auto):扫 shadowed 区间 → 写进 Tavern 周目归档,台账幂等,不碰 DSH 会话文件 - 聊天导入适配器 B1(
/import/formats、/import/plan) - 本地记忆回响 D2:node:sqlite FTS5(trigram) 引擎 + 以
dma:echo(order 54)注入 - D4 标签归一(
lib/ami-tags.js);保留第一轮(lib/keep-first-round.js+preset-modules/) state-bridge收编为dsh-memory-archive/state-bridge子包(含 70 项原样测试)- 查看器:常驻会话集、会话真标题、批量勾选式选常驻
Fixed
- 只带
session.v3.jsonl.zstd的会话整个读不到 / 带旧文件的会话只读到迁移前的冻结快照
(改为走宿主自己的读取链;真机对照:not found→ 99 楼、69 楼冻结 → 103 楼) - 最新一楼看得到字段、看不到上下文(system 正文改从
system/message取,并如实标注来源) requests摘要两套算路漂移(列表页systemChars恒为 0)
Notes
- 收纳与导入目前只有服务端端点,面板还没有入口(API-only)
- 自检一律使用临时 storageDir;真夹具经环境变量提供(不绑定某一台机器)
v0.3.0 · 首次公开
首次公开版本:包名与仓库同名 dsh-memory-archive。记忆库(阅读 / 检索 / 真名解析 / 提示词面板)+ 提示词查看器(装配地图、段级偏移、点开看该段真实正文、注册表导出、诊断)。收纳落库与聊天导入适配器不在本版本内。
First public release. Memory archive + prompt viewer. The collection writer and the chat-import adapter are not part of this version.