# Changelog 版本号写在 `package.json`,日期是提交当天。只记用户能感知的变化,内部重构一笔带过。 ## 0.18.0(2026-10-12) - **适配 dsh 0.2 桌面版(desktop profile)**——切换到桌面应用后插件消失的完整升级: - **消失原因与安装面**:桌面版用独立的 `~/.dsh/profiles/desktop` profile,旧插件只装在 `web` 里。现在 `dsh plugin --profile desktop add …`(或桌面版「插件」页装本地路径)即可,README 安装章节给出两代命令; - **设置系统整体迁移(宿主侧最大改动)**:dsh 0.2 删除了 `ctx.settings.register(ns, schema, {base})`,改为插件顶层导出 `Config`(schemastery schema,字段标记 `.volatile()`),生效值 = 默认层 + profile 的 `cordis.patch.yml` `config:` 覆盖层。schema 依赖同步换成 `@deepseek-ai/schemastery` fork(`.volatile()` 为 DeepSeek 扩展)。内部所有消费方(routes / dock / tools / mail / 命令层)通过 `plainConfigOf` 解引用后的快照访问,形状与旧 `scope.get()` 一致,零改动; - **旧设置自动迁移**:dsh 0.2 首启把 `~/.dsh/settings.yaml` 改名 `.imported` 逐段导入 profile entry——本插件当时不在 desktop profile 里,`memoryleak:` 段(vault 路径、邮箱配置)留在了归档文件里。现在插件首次加载时补导入:用户层已有覆盖则跳过(绝不覆盖新值),导入成功即从归档文件消费掉该段(防重复),`DSH_MEMORYLEAK_SKIP_MIGRATION=1` 可整体跳过; - **客户端目录选择迁移**:`ctx.workspaces.pickDirectory()` 拆到了新服务 `ctx.uiWorkspace`(inject 列表同步替换),设置页「浏览…」与 Vault 引导卡的系统目录选择对话框照常; - **提问卡契约再适配(第三次)**:`conversation.composer` 链的 PendingQuestion 载体从 `.answer()` / `.cancel()` 改为 `.answer({answers})` / `.dismiss()`,`mlAdaptPending` 适配层同步——四张接管卡(类型+优先级组合卡、日期选择器、Vault 目录卡、邮箱设置卡)组件主体零改动; - **设置页保留自定义 UI**:宿主侧 `settings.configure({auto:false})` 关掉按 schema 自动生成的通用设置页(避免与插件自己的 settings.section 分区重复)——目录选择器、邮箱分区、自动保存、格式清单这些自定义交互全部保留; - 其余宿主/客户端 API(commands / tools / userQuestions / agent.followup / snapshotEvents / 全部槽位名 / webServer 路由)经逐一比对确认兼容,未改动; - 测试 535 全过(伪宿主升级为 dsh 0.2 契约:apply(ctx, config) + volatile 引用语义 + attach 式 settings 桩)。 ## 0.17.1(2026-09-21) - **memory_* 工具加上 /ml 门禁:普通对话里模型再也不能自作主张调用**。此前五个真实模型工具(memory_note_context / memory_note_write / memory_ask_gather / memory_mail_fetch / memory_mail_commit)随插件启动常驻注册,任何会话里模型都能看到并「随手」调用(写知识库、读邮件)。现在每个工具的执行先过一道**无状态门禁**(`src/tool-gate.js`):回扫会话事件日志,只有当「最近一次回合发起事件」是 /ml 指令的交接消息(📌 / ❓ / 📬 标记开头)时才放行—— - 用户在交接之后说的任何话(包括回合中的 steering 插话,同样落成 user/message 事件)都立即收回授权——授权只属于那个由命令创建的回合,最严格语义; - 读不到事件日志按未授权处理(fail closed:证明不了授权就拒绝); - 拒绝载荷与各工具 output schema 逐字段同形,文案明确引导模型提示用户改用 /ml 命令;五个工具的描述同时追加使用边界说明,让模型在普通对话里自我规避、少走弯路; - 为什么不用「开锁窗口」:/ml 命令把任务交接给模型回合后立即返回(agent.followup 不被 await),任何基于命令执行期的开锁窗口都会过早关死(回合还没跑完)或过晚关闭(窗口敞着)——从会话日志推导授权是唯一不依赖时序的可靠判据,也没有可被拖延绕过的计时器。 - 右侧 dock 面板不经模型工具(走插件自有 HTTP API),天然在边界外;命令家族中不产生模型回合的子命令(todo / view / mail setup 等)不会被授权。 - 测试 526 → 535(新增门禁 9 个:三家族交接放行、普通用户消息上锁、steering 插话上锁、command/run 兜底的家族判定、fail closed 与旧 .events 回退、五工具拒绝载荷形状、放行路径落业务逻辑、描述边界后缀)。 ## 0.17.0(2026-09-21) - **新增右侧 Dock 记事面板**:浏览器界面右端的常驻 /ml 工作台——不用敲命令就能记一笔、维护待办、翻今日日志。**打开是推挤而非遮盖**:`mlApplyPushState` 运行时从官方稳定锚点(会话滚动区/输入框)攀爬定位应用骨架元素,直接设内联 padding-right 让位(margin 对带显式宽度的骨架无效,padding 在 border-box 下必然压缩列布局)——主窗口真实变窄(0.18s 过渡,与官方左栏折叠同一使用感受;定位不到时自动退回覆盖式),关闭即还原,重载默认收起。开关两处:会话头右侧的橙色「✎ 记事」按钮(主开关)与侧栏底部 Settings 旁(blank 会话兜底);Esc 或 ✕ 收起;控制台 `window.__mlDockDebug` 可查推挤定位与压缩状态(frameW/innerW/width)。面板分上下两块: - **上半(记录区)**:一行「记一笔到今天」输入框(Enter 写入当前日志,与 `/ml <文本>` 同一条落盘路径);下面是**橙色调卡片**(左缘橙条 + 橙染底)形式的记录区——只列今天已记的条目(新增 `extractJournalJots` 只读提取,与 insertNote 同一文法:日志取 `## MemoryLeak` 段顶层条目、周志只取今天的日期组;宿主进程还是旧路由时客户端按同一文法回退提取,刷新页面即用),头部显示文件名与笔数,点标题折叠,记一笔或加待办后自动刷新;看文件全文走 `/ml view`; - **下半(待办区)**:与记录区用更明显的分隔线划开,无底色直接铺列;状态过滤按钮(未完成 / 全部 / 已完成 / 已取消,选中项橙底墨字);「+ 新待办」展开小表单(类型 / 优先级 / 日期),落盘与 `/ml todo add` 完全同构;待办复选框就是方框本体(加粗描边 border-l3、符号 line-height:1 居中;未完成悬停浮出橙色 ✓ 提示、完成打绿 ✓ 带浅绿底、取消灰 ✕,不再「方框+☐字符」双框);每条悬停出取消/恢复、deadline 型「+1天」延期;「撤销(n)」按 LIFO 撤销本面板最近 n 次操作(与 `/ml todo u` 同一套底层恢复机制)。到日的 sleep 待办自动唤醒(转写为 active,与 `/ml todo list` 同一管线),过期 deadline 的日期标红、urgent 徽章标警示色; - **品牌橙(#ff9000)做 dock 身份色**:面板左缘橙条、标题橙点、记一笔条目橙点、选中过滤橙底墨字、侧栏「✎ 记事」开关为橙色胶囊(打开时加橙色外环)——亮暗主题下都醒目,记录区与待办区、侧栏开关与背景一眼可分。 - **dock 全面板统一字体与字号,跟随 ui-font 插件调整**:整个面板只在根部声明一次 `var(--dsw-font-s-14)` 主题令牌(用户字体家族 + 14px/22px 尺寸档),全部子元素继承——dsh-ui-font 在 body 上重定义 `--dsw-font-*` 令牌,面板文字(按钮、输入框、待办正文、徽章、日志内容)随之换家族/缩放,不再有跟不上的硬编码 px;本插件注入的三张样式表(工具卡片、日期选择器、dock)都补打 `data-plugin="dsh-memoryleak"` 标记,纳入 ui-font 的按插件字号注册表。 - **为 DSH 升级预留的三层封装(本次的核心设计)**:dock 是「插件自有 HTTP API + 纯 UI 组件 + 薄挂载适配」三层结构—— - 宿主侧新增 `/api/memoryleak/dock/*` 路由族(`src/dock-routes.js`:board 快照 / journal 全文 / jot / todo 增·改·延期·恢复),面板只与这份插件自有契约对话,业务全部复用与 /ml 命令同一套核心函数(两条入口写出的文件完全同构,互相可见); - 浏览器侧组件是零 DSH 依赖的纯工厂(`createMlDock({ React, api })`),数据进出全是 JSON; - 唯一碰 DSH 槽位的是挂载适配层(`mlMountDock` 的候选挂载位表):逐个尝试、各自隔离故障——今天坐 `shell.overlay`(面板)、`conversation.session.header.utilities`(会话头开关)与 `sidebar.footer.action`(侧栏兜底开关),都是**只加条目、不替换任何官方 UI** 的无风险槽位(右侧 `details` 列是 single 槽、注册即顶掉官方工具详情面板,特意不碰;插件可达的模块基线里也没有宿主子槽的渲染工具,故不采用「占据官方右列」路线);全部失败时 dock 静默缺席(console.warn 留痕),其余功能不受影响。将来 DSH 出官方停靠位或改槽位协议,只改这张候选表。 - **dock 记一笔的焦点不再丢失**:提交期间输入框曾被 `disabled`(浏览器对禁用元素强制失焦),写完一笔焦点就丢。现在输入框在提交期间保持可编辑(防重复提交由「记」按钮的禁用承担),成功或失败后焦点自动放回输入框——连续记多笔不用重新点;新待办表单同款处理(失败后焦点回内容框,直接改了重提)。 - **记一笔的成功/失败提示移回记录区**(显示在输入框下方,「已记录 → 2026W39.md」不再混进下半的待办区);记一笔列表滚动上限从 30vh 压到 18vh 并加 overscroll 隔离——条目再多也只占小半屏,待办区始终保有剩余空间。 - **修复切换会话后推挤丢失、以及修复期的「动画重播」问题**:会话切换会重建应用骨架子树,打在骨架元素上的内联推挤随之丢失(对话重新被 dock 盖住,开 devtools 触发 resize 才恢复);修复初期靠 MutationObserver 补施,但 150ms 防抖窗内应用先全宽渲染再被压回,主界面像重播了一次左移动画。最终方案改为**推挤落在 `#root` 上**(静态 HTML 节点、永不被会话切换替换)——`` 挂类设宽度变量 + 一条 CSS 规则即时生效,切换会话零闪动、零重播,开合动画只在点开关时发生一次;应用不在 `#root` 下时退回运行时攀爬兜底(MutationObserver 维护性补施,瞬时无过渡)。 - **修复开发热更下的「幽灵样式」:注入样式表改为按内容指纹自更新**(`mlEnsureStyle`)。HMR 原位换插件时 loader 只清理它自己登记的样式标签,插件原生注入的 `