# 更新日志 本插件与 dsh 宿主版本一一绑定(peerDependency 锁定精确版本),升级 dsh 前请先确认有适配的插件版本。 ## 0.5.9(2026-10-27)全链路审计修复与边界加固 宿主依赖不变(dsh `0.2.1-rc.3`)。本版汇总四轮代码审计发现的提示词投影、WAL 事务回滚、模板沙箱、酒馆助手桥接、诊断备份与状态存储边界修复。 - **提示词组装、请求投影与消息过滤**: - 过滤宿主注入的 `system-prompt` 消息,不再将其当作用户台词参与世界书扫描、`{{lastusermessage}}` 或正则深度计数。 - 修复预设请求投影与模板摆放中锚点定位、同深度多条目稳定排序、工作区指令剔除后锚点保留及累计长度预算边界。 - 修复 `assemblePrompt` 中相同主触发词的世界书条目共享 `templateCache` 导致渲染串用的问题;`DialogueExamples` 前后的世界书条目现遵循 `preset.formatting.worldInfo` 格式模板。 - 完善宏展开、世界书概率/递归/分组边界及正则深度(空串/`null`/数字字符串)归一化。 - **楼层分支、WAL 回滚与宿主分支接管**: - 修复 WAL 循环覆盖写与回滚游标校验边界;`WorldDeltaStore.revoke` 对已撤销条目返回 `false` 而不重复改写日志。 - 宿主分支接管(`adoptHostFork`)统一先于空白会话退役(`retireStuckBlank`)执行,防止未接管的分支子会话被误写入空轮次事件。 - `regenerate`、`rollbackToFloor`、`editUserMessage`、`editAssistantMessage` 在快照准备与原子发布前复核源会话 `seq` 与开层状态;`continueFloor` 拒绝在开场白楼层上续写;`getFloorSiblings` 对非 `ENOENT` 的瞬时读取错误保守保留兄弟分支记录。 - `forkAgentOptions` 清理父 `options` 半边模型路由,并在回退读取助手消息来源时将 `tavern-deepseek` 归一为 `deepseek-official`;`inferLiveWalLineage` 保留开场白切换持久化的显式空世系 `[]`。 - AI 代答(`impersonate`)保留历史中的 `system` 角色消息并在调用流前复核会话绑定。 - **模板沙箱、卡面桥接与客户端交互**: - 加固隔离 Worker 启动握手、超时淘汰与模板运行时预算校验;修复模板展示净化与重放缓存键边界。 - 修复卡面租约释放、世界书桥接、助手消息历史编辑与 MVU 轮次恢复/取消边界;修复客户端芯片、语音、世界书编辑器与脚本面板的状态同步细节。 - **角色卡、记忆维护、工具预算与诊断备份**: - 仅在 `card.spec !== 'chara_card_v1'` 时解包 `raw.data`;平铺卡归一化跳过顶层 `spec`/`spec_version`;人设保存碰撞消解纳入已有文件的 `sourceId`。 - `MemoryStore` 序列化与解析兼容 `U+2028`/`U+2029` 行分隔符,`write`/`update` 返回经解析归一化的正文,`saveAliases` 统一归一化别名;空闲压缩拒绝空白摘要并在压缩后复核容量是否回落至阈值内。 - `resolveReadableAssetPath` 拒绝读取内部 `memory/aliases.json`;目录预览截断避免切裂 UTF-16 代理对;`tavern_lore_read` 损坏聊天书提示纳入输出 token 预算;`tavern_worldstate_update` 严格校验 `expiresAt` 日历日期合法性。 - `doctor` 检查剧情目录下的 `.preparing-*` 链接并报告 `STORY_LINK_SKIPPED`,修复坏 `card.json` 后读取 `.archive.json` 超预算的统计归类,并严格校验 `--home` CLI 参数;`backup` 引用检查兼容 `@dsh/character` 占位与带碰撞后缀的资产文件。 ## 0.5.8(2026-10-26)压缩后历史编辑修复与请求清理 宿主依赖不变(dsh `0.2.1-rc.3`)。 - **「缓存优先布局」默认改为关闭。** 没有手动保存过这一项的用户升级后会改按 SillyTavern 原位置投影:深度注入与历史前条目各回原位,扮演结构更接近预设本意,但这些条目每轮变化或随历史漂移,其后的历史几乎每轮重新计费,DeepSeek 前缀缓存命中率会明显下降、费用上升。更在意费用的用户可在「设置 → 提示词」重新开启;已显式保存过该项的设置不受影响。 - 新增两个请求清理开关(「设置 → 提示词」,默认开启,仅 DeepSeek 官方通道):「隐藏宿主身份句」从请求副本删去 `You are an AI agent powered by DeepSeek Harness.`;「剔除工作区指令」不再把宿主注入的 AGENTS.md / CLAUDE.md 基线发给模型,避免每轮与角色设定抢解释权。两者只改本次请求,宿主历史与会话日志不变,清理量显示在最近请求的诊断里。开关与缓存优先布局一样随本轮计划冻结,同轮中途修改下一轮生效;身份句按原文精确删除,宿主改文案时自动失效,不清洗其它内容;锚在工作区指令前后的模板片段仍按原位置落位。项目协作类会话需要工作区指令时请关闭对应开关。 - 精简稳定段纪律与本轮提示:开场改为「你就是下面设定的角色本人」,本轮规程合并重复的工具与返回值说明,减少把模型推回执行器口吻的措辞,协议要点(无损 JSON、批量调用、检查 ok、同轮写入不重做)保持不变。standing 钉位版本递增,升级后首轮会重新钉死一次。 - 修复 [issue #14](https://github.com/Amakurai/dsh-liketavern/issues/14):编辑或删除上下文压缩之后的历史消息生成分支时,此前所有压缩管理事件都被替换为过期标记,而编辑点之前的摘要消息仍声明 `compact-checkpoint`,子会话重新加载时报 `compaction checkpoint has no matching compaction/start`。现在按整个压缩事务判断:start / summary / 检查点 / end 全在编辑点之前且引用完整时整组保留,任一事件位于编辑点之后或被压缩范围包含编辑目标时整组作废并恢复原始消息;被作废的 `/compact` 命令及关联 `command/run`、`command/done`、受影响的系统提示词就地重写、`image/offload`、不配对的工具结果裁剪与引用已删除消息的会话标题事件一并作废。本修复只防止产生新的坏分支,此前已生成且无法加载的子会话不会被自动修复。 - @INJECT 未加引号的正则保留字面尾逗号,引号内补齐双反斜杠转义。 - 座位补偿在冷却结束后复查,被吞掉的状态边沿不再永久丢失;复查补发最多 3 次,卸载时清理冷却定时器。 - 卡面租约接口预算只统计未关闭记录,已关闭墓碑不再误拒新帧;墓碑总量有界淘汰,关闭旧卡面立即释放连接预算。 - 记忆维护轮次登记表加有界淘汰,剧情数量增长不再无界膨胀;删除只写不读的世界书缓存状态,按轮冻结统一以本轮计划为准。 ## 0.5.7(2026-10-24)适配 dsh 0.2.1-rc.3 与模型列表跟随 升级适配 **dsh `0.2.1-rc.3`、Node.js ≥ 24**。`@deepseek-ai/cordis` 仍为 `4.0.5`、`@deepseek-ai/schemastery` 仍为 `3.18.5`;`peerDependencies`、`overrides`、`devDependencies` 与 `allowScripts` 统一改为精确 rc.3,锁文件只重解析宿主条目。升级后请完整重启宿主。 - rc.3 相对 rc.2 只有四个包的实现有变化:`dsh-llm-deepseek` 新增 `/models` 模型列表、`dsh-llm-deepseek-api-key` 接线、`dsh-client-ui-primitives` 的 Tooltip/Menu 增量与 `dsh-client-ui-settings-general` 的桌面埋点;其余宿主包只有版本号变化。 - Tavern 的 DeepSeek 通道跟随宿主模型列表:列表里的新模型会出现在 Tavern 分组,上下文窗口、输出上限、图片能力与系统提示模式按列表声明投影。此前这些模型会拿到 1e6/256k 的回退能力、图片被误判为不支持,也不会产生宿主同款的拒绝。 - 需要更高客户端版本或本构建不支持的模型,现在会在发出网络请求前给出与宿主相同的 `CLIENT_UPGRADE_REQUIRED` / `MODEL_UNSUPPORTED`;上下文用量与压缩阈值也不再按回退窗口计算。 - 列表请求只读公开 `/models`,沿用宿主凭证引用与当次 `prepareCall` 的取消信号;请求失败或取消之外的故障退回内置目录,现有内置模型不受影响。设置变化后重新解析 endpoint、目录与是否继续跟随,dispose 时中止在途请求。 - 依赖安全:干净 `npm ci` 安装 649 个包,`npm audit` 为 0 项已知漏洞;锁文件未引入新的第三方运行库,也未顺带漂移无关传输。 - 发版纪律:新增 `npm run host:check`,peer / dev / overrides / allowScripts / 锁文件必须指向同一个精确宿主版本,CI 两个平台与 release workflow 都先执行,避免再次出现 tag 与附件版本脱节;Release 附件同时提供 `SHA256SUMS.txt`,与 README 的完整性校验说明一致。 - 验证:构建通过,297 个测试文件、3596 项通过、11 项按平台或能力跳过、0 失败;`doctor:check`、`backup:check` 与 519 文件发布白名单通过。独立临时 `DSH_HOME` 用 rc.3 CLI 安装本地 tgz 并启动 `dsh --profile web`:鉴权首页 200、加载 `dsh-liketavern/client.js`、`dsh-tavern/` 数据目录完整初始化、日志无插件加载错误。未调用真实模型,也未做浏览器交互验收。 ## 0.5.6(2026-10-22)预设注入加固与发版纪律 宿主依赖不变(dsh `0.2.1-rc.2`)。对照 SillyTavern 与同类 dsh 酒馆插件的已知问题做的一轮修复。 - 角色卡 `card.json` 缺失或损坏(例如手改出错)时,读取会话绑定明确报错,不再当成「角色已删除」自愈:此前库里只剩另一张卡时会话会被静默改绑到那张卡并新建剧情,多张卡时绑定文件被直接删除。卡目录真正不存在时仍按唯一同名卡接回。 - 正则 `markdownOnly`(仅格式显示)对齐 SillyTavern:作用楼层仍由 placement 决定。「用户输入 + 仅格式显示」的用户气泡美化正则不再套到 AI 回复上(常见的 `^(.*)$` 包裹正则此前会把每条回复整段包进去);仅世界书 placement 的显示正则不再作用于任何气泡。 - 玩过的角色现在可以永久删除。宿主没有会话删除事件,删除宿主会话或换卡后剧情会残留,此前只要有剧情就一律拒绝。删除确认框会列出全部剧情并标注是否仍被会话绑定:没有绑定的剧情随角色一并删除;仍有会话绑定或绑定文件损坏时继续拒绝;确认框打开后新产生的剧情不在确认清单里,同样拒绝。 - 用手机等设备经局域网 `http://` 打开宿主时(非安全上下文,浏览器不提供 `crypto.randomUUID` 与 `crypto.subtle`),气泡渲染、脚本运行器、MVU 回执校验和卡面桥接不再整段报错:主页面改用 `getRandomValues` 生成 ID、摘要回退到纯 JS SHA-256,卡面 iframe 补上 `crypto.randomUUID`。 - 补齐 SillyTavern 新版宏名:`{{charDescription}}`、`{{charPersonality}}`、`{{charScenario}}`、`{{greeting}}`、`{{charVersion}}`、`{{charCreatorNotes}}`(`{{creatorNotes}}`)、`{{charDepthPrompt}}`、`{{mesExamplesRaw}}`(`{{mesExamples}}`),此前未识别时会原样发给模型;新增 `{{deletevar}}`/`{{flushvar}}`(含 global 拼写)与 `{{varexists}}`/`{{globalvarexists}}`,删除与读取按出现顺序执行。 - 世界书包含组对齐 SillyTavern:多条「组内优先」时确定性地取排序(order)最大者,不再在其中随机;`group` 字段可用逗号列出多个组,条目在任一组落选即不注入。 - 会话芯片的上下文用量新增一行诊断:历史里仍在模型可见面上的旧本轮(`tavern:turn`)快照份数与估算 token。宿主每轮追加新快照而不替换旧的,非 DeepSeek 供应商会把它们全部发给模型;DeepSeek 通道发信前已剔除,会标注出来。 - 依赖安全:`markdown-it` 升至 15.0.3,修复两项二次方复杂度公告;开发依赖 `vitest` 4.1.12、`vite` 8.2.4、`@modelcontextprotocol/client` 2.3.1。模板运行时指纹随之变化,v0.5.3–v0.5.5 保存的模板检查点仍按原指纹恢复。详见 [依赖安全记录](https://github.com/Amakurai/dsh-liketavern/blob/main/docs/DEPENDENCY_SECURITY.md)。 - `tavern:standing` 与 `tavern:turn` 向宿主声明 `interpolate: false`:角色卡、预设与世界书里的 `{{…}}`(未知宏、Handlebars 模板、代码示例)原样入模,不再改写成全角 `{{…}}`,`{{cwd}}`/`{{model}}` 也不会被宿主替换。standing 钉位版本递增,升级后首轮会重新钉死一次。 - 预设布局拒绝模型控制标记:`<|Assistant|>`、`<|im_start|>`、`[INST]`、`` 等一旦出现在预设或模板条目里,冻结与请求投影两处都会明确失败并点名条目角色与来源,不再把伪造的轮次边界原样发给模型。普通 Markdown、HTML、`` 与 `<|-_-|>` 一类颜文字不受影响(ASCII 标记要求首字符是字母,`<|reserved_special_token_0|>` 仍然拦截)。 - 投影断言宿主 system 仍在请求首条:布局若把系统提示挤进历史中段(适配器会把 system 降级成历史消息,请求照样能发但行为已变),直接拒绝投影而不是静默降级。顺带把 `presetRequestProjection.ts` 里两处字面 NUL 分隔符改成 `\u0000` 转义,源码恢复为可编辑文本。 - 发版纪律:新增 `scripts/release.mjs`,所有能拒绝发版的事(脏工作树、非 main、版本不前进、本地/远端 tag 重名、CHANGELOG 缺本版段或段为空)都在改版本、提交、打 tag、push 之前完成,支持 `--dry-run`。push 出的 `v*` tag 触发 `.github/workflows/release.yml` 作为唯一发布点:重跑构建、测试与包边界,从 CHANGELOG 生成本版 notes 与标题,把 `npm pack` 产物附到 GitHub Release(分发走 tag + Release,不走 npm)。notes 与标题由本地脚本和 workflow 共用同一个抽取函数;发布提交同步 `package-lock.json` 根版本,`--atomic` 推送保证分支被拒时 tag 也不落地。两项脚本都有真 git + 裸远端的集成测试。 ## 0.5.5(2026-10-20) 继续适配 **dsh `0.2.1-rc.2`、Node.js ≥ 24**,宿主依赖不变。本版汇总一轮代码审计发现的分支、回滚恢复、展示与沙箱边界问题,并修复备份工具拒绝合法大角色卡的问题。升级前请备份数据,安装后完整重启宿主。 - 重新生成与编辑用户消息只重放该楼层真正的驱动输入:宿主写入日志的 runtime context、同轮写入确认与步骤提示不再被当作新用户台词;同轮多条用户输入按原顺序合并为一条,不再把一轮拆成多轮。续写轮仍保留插件来源。 - 回滚中断留下恢复游标时,整个剧情的写入(含面板、维护与其它楼层)明确拒绝,回滚自身仍可完成;崩溃后残留但游标已消失的标记不再挡住写入。「记忆」面板选中剧情后会提示未完成的恢复,并提供「重置回滚游标」出口,重置后仍需重新回退该楼层。分支快照在来源剧情恢复期间拒绝发布。 - 展示净化保留 Markdown 代码块与行内代码里的 `