# Changelog 版本号写在 `package.json`,日期是提交当天。只记用户能感知的变化,内部重构一笔带过。 ## 0.16.3(2026-09-07) - **修复 dsh 升级后 /ml todo add / init / mail setup 表单卡失效、快捷键全部消失的问题**。dsh 0.1.2 升级更换了 `conversation.composer` 链契约:select 入参从「owner.interactions 交互数组」改为 `{ pendingInteraction }` 单载体,组件消费的 matched 也从「interaction.payload.questions + respond 协议」改为官方 `PendingQuestion`(`.questions` / `.answer()` / `.cancel()`)。旧 select 在新契约下永远返回 null,四张接管卡(类型+优先级组合卡、日期选择器、Vault 目录卡、邮箱设置卡)全部静默落回官方通用问答 UI——没有快捷键、没有日历、逐题点提交(正是「看起来退回老版本」的原因;通用 UI 是官方兜底,属优雅降级而非报错)。修复:新增薄适配层把新载体包成组件已消费的旧 wait 形状(payload.questions + respond),四张卡的组件主体零改动,四个 select 迁移到新签名。 - **修复同一升级导致的「流程结束后光标不回主输入框」**:dsh 0.1.2 把主输入框从 `textarea[data-phase]` 换成了 contenteditable 的 `[data-composer-input]` div,旧锚点选择器永远落空,交互流程(todo add / init / mail setup 等)结束后要手点输入框才能继续打字。`mlFocusMainInput` 现在优先锚 `[data-composer-input][contenteditable='true']`(新旧两个选择器都试,旧环境回退 textarea)。 - **普通命令执行完也会丢焦(/ml todo、todo d、todo c 等)**:新输入框在命令执行期间会被置为不可编辑(焦点被浏览器丢到 body),完成后框架不恢复——官方 conversation 包里没有任何主输入框焦点还原逻辑。现在 /ml 命令卡定格(运行中 → 完成)时一并把焦点还给输入框(`mlFocusMainInput` 加第 4 段 700ms 兜底,等 contenteditable 翻回可编辑态)。问答流不受影响:`command/done` 在问答结束后才发生,问题卡已不在场。 ## 0.16.2(2026-09-04) - **`/ml mail read` 报告结构简化:不再区分待办 / 待阅 / 重要事件三类,只输出一份「重要事项」编号清单**——所有重要的事务与信息(需要动手的、需要跟进的、值得知道的)都列在同一份编号列表里,需要处理的条目标注期限与来源。此前「重要事件里明明有需要做的事、待办列表里却没有」的错位不再可能发生:清单里的**每一条**都可以用 `/ml mail todo <编号>` 转成待办(同一套 todo add 表单,期限自动带入)。 - `memory_mail_commit` 的 `todos` 参数语义同步为提交「重要事项」清单(字段更名 `mailState.lastItems`,兼容读取 0.16.1 的旧 `lastTodos`);相关测试断言随报告结构同步更新。 ## 0.16.1(2026-09-03) - **交接消息收进「注入上下文」折叠行,不再撑开整个用户气泡**。`/ml note` / `/ml ask` / `/ml mail read` 的任务交接消息 source 从 `user` 改为 `plugin`(notice 形态)——对话框里只留一行摘要(如「📌 /ml note 整理任务(…)」),完整指令照常进模型上下文。交接文本同步瘦身:静态协议全部挪进工具描述与工具结果(模型每次请求都能看到),消息里只留动态事实(范围 / 窗口 / 问题原文 / Vault 路径)。 - **`memory_*` 工具卡片统一为紧凑中文行**:浏览器半注册 `tool.call.toolview` keyed 视图,五个工具显示为「MemoryLeak 笔记 / 问答 / 邮件工具 · 摘要」的形态(如「MemoryLeak 邮件工具 · 增量读取新邮件」),替代通用卡的「Tool call + 原始 JSON」;运行中带扫光,失败显错误首行,结果可展开看全文。样式自包含,不依赖 primitives 包。 - **`/ml mail read` 报告的「重要事件 / 待办」改为编号列表**(待阅保持圆点),待办条目从此可寻址。 - **新增 `/ml mail todo <序号>`**:把最近一次 mail read 报告「待办」清单的第 <序号> 条写入 Vault 待办——走与 `/ml todo add` **完全相同**的表单(类型 / 优先级 / 日期问答与 web 端组合卡、日历选择器原样复用);邮件里明说期限的,选 deadline 时自动带入选中的期限(免日期问答),成功回执标注「期限取自 mail read 报告」。清单随 `memory_mail_commit` 一起存进 Vault(`mailState.lastTodos`,vault 限定键),跨会话、跨重启都可引用;模型可通过 commit 的新可选参数 `todos` 按报告编号顺序提交清单(每项 {text, due, from, subject},提交即按条数/长度/期限格式清洗),空数组 = 本批无待办并清空引用清单,不传 = 保留旧清单。 - **`memory_mail_fetch` 的分析要求更新**:「重要事件 / 待办」明确要求编号列表输出,并指引模型在 commit 时提交 todos。 - `/ml todo add` 的交互流抽为共享模块(`src/todo-add.js`),两个入口行为完全一致。 - 测试 491 → 502(新增 mail todo 文法 6 断言、清单清洗 4 例、mail todo 端到端 4 例、commit todos 存取 2 例)。 ## 0.16.0(2026-09-02) - **交互架构反转:`/ml note`、`/ml ask`、`/ml mail read` 全部改走与普通对话完全相同的渲染与调用路线**。0.15.1 的合成事件是「回放式同构」——工具卡片与思考块仍只能出现在结论之后。现在把控制流反过来:命令只做本地检查,把任务作为一条 user 消息交给模型的原生回合(`agent.followup`,与官方 `/goal` 命令同款通道),模型在回合里调用插件注册的**真实模型工具**完成工作——思考流式在前、工具卡片在思考与输出过程中内联出现、最终 markdown 回复原生落定,三层体验与普通回复零差异。 - **五个真实工具**(`ctx.tools.register`,随插件卸载自动回收):`memory_note_context`(存量登记 + noteSkill 约定 + 字段规范)、`memory_note_write`(协议进工具参数,清洗与守卫全在工具内)、`memory_ask_gather`(预算/相关度/去重的资料汇集)、`memory_mail_fetch` + `memory_mail_commit`(两段式读信:下载解析不推进进度,分析完成模型显式 commit 才推进——漏调 = 下次重读同一批,绝不漏邮件); - **内容质量不降级**:协议、字段白名单、条数/长度上限、表格注入清洗、零丢失合并、表格列宽对齐、备份开关全部保留,只是从「插件解析模型文本」变成「模型结构化工具调用、代码守卫」;已知状态注入(增量增补)由 context 工具继续承担; - **邮件分析不再强制 JSON 协议**:模型直接输出 markdown 阅读报告(总评/重要事件/待办/待阅),展示质量随模型; - **边界语义两代兼容**:新会话以最后一次成功的 `memory_note_write` 工具结果为整理边界;旧会话(升级前)回退到成功收尾的 `/ml note` 命令对。交接命令自身的完成事件不代表整理完成,不会错误消化区间;交接消息与工具结果被排除出下个整理区间(它们是动作记录,不是对话); - **移除旁路管线**:`ctx.llm` 旁路调用、合成事件 sink、模型停摆看门狗随之退役——停摆/重试/取消现在由原生回合的 llm/retry 与 turn 生命周期处理。core 的协议解析与 digest 纯逻辑保留(工具路径与测试共用)。 - 测试 494 → 491(移除旁路流式/看门狗/合成卡片用例,新增交接消息、原生边界、工具端到端 13 个:写盘守卫、主键合并、资料汇集、两段式读信、空库与未配置分支)。 ## 0.15.1(2026-09-02) - **`/ml note` 的整理过程补齐成普通对话的完整形态**。整理本身还是旁路模型调用(不进上下文、协议解析与合并守卫照旧),但过程显示不再只有 markdown 摘要——现在与真实模型回合**同构**: - **思考过程可见**:模型的 reasoning(思考)此前被静默丢弃,现在原样流式转发,UI 渲染成与普通回复同款的可折叠思考块(`/ml ask`、`/ml mail read` 同步受益)。流式气泡按块位分层:思考块 0、正文 markdown 块 1,交错到达不再互相覆盖; - **落盘过程是真实的工具卡片**:每次写入 Vault(知识条目、结构化登记、index、日志 ## NOTE)即时合成 `tool/call` 事件——卡片在写入进行中逐个出现并转圈,回执定格后按序补落 `tool/result`,卡片翻到完成态(写入摘要:已创建 / 已合并 N 条 / 已写入 N 条工作记录);落盘失败的未完成卡片如实显示为中断。事件形状与 agent loop 逐字段一致(未知工具名走通用卡片); - **转写合法性(关键设计)**:合成工具卡片是真实转写内容——`tool/result` 会进入模型可见历史,provider 要求 tool 消息必须紧跟在带 tool_calls 的 assistant 消息之后。因此回执消息携带与调用一一对应的 tool-call 块(参数只含文件/动作/规模,不带文件全文,不为下轮上下文增重),结果事件排在消息之后按序补落——与真实回合的事件顺序完全一致,下一次普通对话不受影响; - **区间干净如旧**:上一轮 note 的合成写入结果(`ml_note_write`)在下一个整理区间被整条排除(连同回执消息)——它们是动作记录,不是对话内容。 - 测试 489 → 494(新增思考转发 2 个、写入卡片轨迹 1 个、落盘失败不留孤儿 1 个、合成结果区间排除 1 个)。 ## 0.15.0(2026-09-01) - **新增 `/ml mail`:工作邮件增量阅读**。把 IMAP 邮箱接进 /ml:设置里配好账号就能「只读新邮件、提取待办待阅」,邮件原文绝不落 Vault。 - **设置与引导**:邮箱账号、密码/授权码、登陆方式(密码 或 OAuth2 token)、IMAP 服务器/端口/TLS/目录/单次上限都在 GUI 设置 → MemoryLeak 的「邮箱(/ml mail)」分区;没配置时执行 `/ml mail`(或 `/ml mail read`)直接弹出**设置引导对话框**(web 端是一张表单卡:服务器 / 账号 / 密码三项,密码遮蔽输入),填完**真连一次 IMAP 试登陆**,通过才保存。`/ml mail setup` 随时重配;留空提交 = 沿用当前值(换服务器不用重输密码)。密码明文只存 `~/.dsh/settings.yaml`(本机),双写同步会把它从 Vault 设置文件里剔除,绝不随目录迁移。 - **自建服务器的证书关(产品内闭环)**:试登陆遇「证书校验不过」(自建 Exchange 的内部 CA/自签证书——Windows/Outlook 走 Windows 证书库所以能用,Node 不读它)时,引导自动抓取服务器出示的证书并就地弹**三选一**:「信任并保存」(证书存入设置 `mailCaPem`,之后连接以它为信任锚**继续严格校验**:证书链 + 主机名;同款证书不再重复问)、「跳过证书校验并保存」(兜底:不再验证服务器身份,连接仍加密;隐式 TLS 与 STARTTLS 模式都可用)、「取消」。GUI 设置同步提供「跳过证书校验」开关与「信任的证书」文本框(改动自动保存)。 - **`/ml mail read` 增量阅读**:只处理「上次 read 结束 → 现在」的新邮件(首次默认当天 00:00 起);IMAP `SEARCH SINCE` 粗筛 + 精确到分钟的内存过滤,超单次上限(默认 50 封)保留最新、丢最旧的会如实告知。读完把结束时刻写进 Vault 的 `.memoryleak.yaml`(`mailState.lastReadEnd`,vault 限定键,GUI 保存不会冲掉),下次从这里继续——分析失败不推进进度,重试不漏邮件。 - **两条铁律**:① 邮件原文只下载到**系统临时目录**(`os.tmpdir()` 下一次性目录,用完即删;崩溃残留由下次执行清扫 24 小时以上的旧目录),绝不写进 Vault 或当前工作区;② **下载与清理全程零模型调用**——模型只出现在「分析已下载的邮件」这一步,窗口内没有新邮件时直接返回、连分析都不发生。 - **分析产出**(花 token,与 note/ask 同款流式过程显示):当前模型通读后输出严格 JSON(代码侧字段白名单 + 条数/长度上限清洗),在会话里流式呈现**总评 / 重要事件 / 待办(需要处理,带期限)/ 待阅(值得一看)**;命令卡片回执含窗口、封数、token 用量与「临时目录已删除」说明。边流边解析的增量摘要对截断、fence、杂文字全部容错。 - 连接失败提示可排障:认证被拒提示「QQ/163/126 要开 IMAP 并用授权码」、连不上提示查地址端口、TLS 失败提示查端口与开关匹配;**证书类失败(`unable to verify the first certificate`)单独分桶**——不再误导成端口/TLS 开关问题,直接指向「信任并保存」/「跳过证书校验并保存」引导;维护者排障工具随包发布:`scripts/probe-mail-tls.mjs`(分层定位网络/端口/证书)、`scripts/export-imap-ca.ps1`(导出证书链 + Node 自检)。 - **模型停摆看门狗(note / ask / mail read 共用)**:此前模型服务端或网络停摆(连接无响应也不报错)时,`/ml note` 等命令的旁路模型调用会**无限等待**,表现为「卡死」只能手动取消(2026-09-01 实录:一次 note 等了 85 秒零输出后用户取消)。现在 `streamNoteCompletion` 加了双层超时——**首字 120 秒**无任何输出、或流中途**连续 90 秒**无输出,即主动中止并给出明确错误(「模型 N 秒没有响应……请稍后重试」),不再永久挂起;超时值可通过入参覆盖。用户主动取消(Esc)行为不变。 - **失败/取消的 note 不再吞掉身前的对话**:整理边界从「上一个 note(无论成败)」改为**只认成功完成的那次**——失败、取消或停摆被中止的 note 不消化它身前的对话,下次执行回溯到更早的最后一次成功 note 起算。此前一次失败的 note 会把它身前未整理的对话永久跳过(上述停摆实录的连带伤害:25 条对话险些丢失)。 - **设置页改为改动即自动保存**:去掉「保存」按钮——任何改动 600ms 防抖后自动落盘(全局与 Vault 双写同步),页面底部常驻保存状态(时间戳 / 失败原因);非法输入不落盘,红色「未保存:原因」就地提示,改到合法即自动续存;版本冲突自动拉新重试;「恢复默认」「清除」仍立即生效。 - 测试 408 → 489(新增 core/mail 纯逻辑 27 个、mail 宿主胶水 40 个、**真实 IMAP 协议冒烟 1 个**——本地起协议级 IMAP 服务器让真 imapflow 走完 SEARCH → 信封 → 逐封 SOURCE 下载全流程,专防 API 名 / 协议漂移回归;命令文法与插件端到端若干、模型停摆看门狗 3 个、失败边界回退 2 个)。 ## 0.14.0(2026-08-18) - **写时 markdown lint:表格列宽自动对齐**。插件写回任何 markdown 文件时(`/ml` 记录、todo 增改与 d/c/p/u 写回、`/ml note` 全部落盘),自动把**整个文件里所有规范表格**按每列最大宽度补空格重新对齐——中文等宽字符按 2 列宽计,等宽字体下竖线肉眼对齐;分隔线随列宽伸展,对齐冒号(`:--` / `--:` / `:--:`)保留,单元格内的转义管道 `\|` 不破表。`/ml note` 渲染的表格(内置表 / index / 自定义表头表)从源头就是对齐的。 - **只补空白、不动内容**:每个单元格的文字逐字保留(对齐前后 trim 相等),表格之外的文本一个字符不动; - **该躲的都躲**:代码围栏(``` / ~~~)里的表格样文本、列数不齐(手改坏)的表、缩进 ≥4 的代码块、各行缩进不一致的嵌套表,一律原样不碰;识别不了的绝不猜测; - 非 .md 文件(yaml 等目标)原样写回;幂等,反复写不变形。 - **`/ml note` 流式过程改为结构化显示**。此前把模型的原始 JSON 逐字转进气泡,没有 markdown 结构,前端渲染糊成一团。现在改为**边流边解析**:每完成一段就追加一段 markdown(`**摘要**` → `**工作记录**` 列表 → `**知识条目**` 列表 → `**结构化登记 · 类别**` 列表),与普通对话同款的分块渲染;完成后的气泡回执也改为 markdown 分块(摘要 / 写入 / 注意)。命令卡片的纯文本回执不变。任何模型输出(截断、fence、杂文字、非法 JSON)都不会让过程显示抛错。 - **新增 `/ml ask <问题>`**:`/ml note` 的反向——把 Vault 当资料库,用当前模型回答提问(**只读,绝不写 Vault**)。自动汇集 MOMENTO 索引、结构化登记(含 `noteStructured` 自定义目标)、MOMENTO 知识条目(按问题关键词挑最相关的在前)、近期 3 份日志,总量控制在约 8 万字符预算内;模型被要求只依据资料回答、标注来源文件、没有就说没有。回答以 markdown 流式显示(与普通对话同款渲染),完成后进入对话上下文可继续追问;命令卡片另给纯文本回执。同名文件(登记目标 vs MOMENTO 条目)全局去重,资料不重复占预算。 - **`/ml todo a` 成为 add 的第二个简写**(与 `n` 等价)。 - **todo 表单键盘快捷键**:类型+优先级组合卡支持数字 `1/2/3` **或字母 `d/s/a`**(首字母)选类型(deadline/sleep/anytime)、字母 `u/m/l` 选重要程度(urgent/medium/low,chip 上有提示角标);日期选择器支持数字 `1-4` 直选今天/明天/本周/本月、`←→` 切月。Esc 取消照旧;焦点在输入框时不吞打字。 - **`/ml note` 的 ## NOTE 模块落位修正**:新建时建在 `## Todo` 模块**之后**(此前插在日志流水账与 Todo 中间);已有 NOTE 时照旧追加到模块尾部。没有 `## Todo` 的日志退回 `## MemoryLeak` 之后。 - 测试 364 → 408(新增 table-align、digest 流式摘要、ask 文法/纯逻辑/资料汇集/端到端、NOTE 落位用例)。 ## 0.13.1(2026-08-18) - **修复 d / c / p / u 的行号错位漏洞**:此前 `/ml todo list` 之后文件被外部改动(插行、删行),d/c/p 会按过期行号**改错行**(可能静默误伤另一条待办),u 则报错。现在每次操作前重读文件做**内容校验与重定位**: - 原行号处内容仍等于 list 时的行原文 → 行没挪,直接操作; - 行号处不符 → 在同一文件里找内容完全相同的行,**恰好一处**才用新行号继续(行挪了也能操作对); - 找不到(行被改/删)或有多处相同(无法分辨)→ 红字报错「请重新 /ml todo list」,文件一个字不动; - 撤销(u)同样支持重定位:操作之后行挪动了也能撤销,行内容被改仍拒绝。 - **连续操作不再要求重新 list**:d/c/p/u 成功后自动回写寻址表(该条目的行原文与完成/取消态),`d 1` 之后紧接着 `d 1`(切回)或 `u` 都继续有效——此前连续操作会因寻址过期而失败。 - 新增 6 个错位场景回归测试(上方插行/删行/改行内容/重复行/撤销时挪动/连续操作),全套 370 个通过。 - 调整了/ml view的ui样式,排版更紧凑一点 ## 0.13.0(2026-08-18) - **新增 `/ml todo c <序号>`(cancel):取消一条待办**。复选框变 `[-]` 并记 `cancelled:日期`(如 `- [-] (ml:deadline 2026-09-01 urgent cancelled:2026-08-18) 放弃的稿子`);再执行一次恢复原样。已取消项从默认列表隐藏(`/ml todo l cancelled` 可单看,列表里显示 ☒ 与取消日期);已完成的条目拒绝取消(提示先 d 切回),已取消的条目也拒绝标完成(提示先 c 恢复)——完成与取消互斥。普通手写待办同样支持(`- [ ] ↔ - [-]`)。`u` 可撤销。 - **新增 `/ml todo p <序号> [天数]`(postpone):延期 deadline 待办**。截止日往后推 N 天,不填天数 = 延 1 天(如 `p 3 7` 把 09-10 推到 09-17);跨月/跨年/闰年由 UTC 日期计算保证。**只对 deadline 型有效**——sleep / anytime / active / 普通待办红字报错「只有 deadline 型待办能延期」;已完成/已取消的条目同样报错。单次上限 3650 天(防手滑)。`u` 可撤销(恢复原截止日)。 - **撤销栈统一**:`u` 现在撤销最近一次 `d` / `c` / `p`(LIFO 可连续);撤销改为「恢复操作前原文」而非翻转(连续 d-d-u 等场景语义正确),行被外部修改时仍拒绝撤销。 - 状态过滤新增 `cancelled`(`/ml todo l cancelled`);默认 open 列表同时隐藏已取消与未唤醒 sleep;列表摘要与 JSON 契约带已取消计数;浏览器端已取消条目置灰(☐/☑/☒ 三态,取消不加删除线)。 - 已取消的 sleep 到唤醒日不再自动转写 active(保持 `[-]` 形态)。 ## 0.12.0(2026-08-18) - **新增 `/ml note`:用当前模型把对话压缩进知识库与工作记录**。每次执行只整理「上一个 `/ml note` 之后 → 现在」的对话(本会话第一次执行则整理全部上下文),产出: - **工作记录** → 当天(或本周)日志的 `## NOTE` 段:每次整理一个独立的 `### HH:mm · 摘要` 小节,**纯追加**,已有小节永不改动; - **知识文件** → Vault 的 `MOMENTO/` 目录,一条长期知识一个文件(同名再写追加「## 更新 <日期>」分节),附 `index.md` 索引; - **结构化登记** → databases / servers / credentials / glossary 四类:按主键合并去重,凭证只登记存放位置与账号、永不记录明文; - **汇总回执** → 整理范围、写入文件清单、模型与 token 用量(含版本号,一眼识别运行的代码);条目不合规逐条告警而非整体失败。 - **整理过程在会话里实时可见**:开始信号立即出现(整理范围 + 模型路由),模型压缩输出以普通助手回复同款的流式样式逐字显示,完成后同一气泡定格为「📌 已整理」结果摘要。实现为复用 DSH 会话的 assistant-step 事件管线:合成事件用 **turn 0 专属命名空间**(真实对话从 turn 1 开始,且 UI 校验 turn/step ≥ 0),`step/start` 建立节点、chunk 流式、`assistant/message` settle、`step/end` 闭合;不写 `turn/start`,不污染 agent loop 轮次计数。结果摘要作为一条正常助手消息留在对话上下文(下轮模型可见),下次压缩自动排除、不计入区间。 - **零丢失写入(防覆盖设计)**:模型只做「压缩与抽取」(严格 JSON:字段白名单 + 类型收窄 + 条数/长度上限,代码容错剥 fence),**格式与落盘全部由代码决定**: - 防丢失守卫——合并后主键集合必须包含合并前的全部(sections 按「小节+复合主键」粒度),违反即拒绝写入; - 只认声明的格式(表头/标题模板/YAML 列表);**手写文件、格式对不上的内容永远原样保留**,只在文件末尾追加带日期的小节,绝不重写; - 未声明的字段(老库的 `password` 等自有键)模型永不填写、合并时原样带过。 - **适配手工维护的老库格式(vault 限定 `noteStructured` 配置)**:在 `.memoryleak.yaml` 里按类别声明目标,三种格式—— - `sections`:`## 类型章 + ### IP:port 小节 + ```yaml 块` 的手工库;`heading` 模板定位小节、`key` 复合主键匹配块(如 `[host, database]` 同机多库各一条);命中块内合并(列表字段追加去重、数字端口保型)、节内追加新块、全新小节进末尾未分类章; - `yaml`:YAML 对象列表,额外字段原样保留,非列表文件跳过保护; - `table`:自定义表头的 markdown 表格。 - `aliases` 字段改名(模型说 name/user/notes,落盘写 hostname/admin/note);`extraFields` 声明库自有字段(environment/purposes/accounts…,说明进 prompt,转写中出现才填);配置校验失败直接报错列出全部问题,绝不带错误配置写文件。 - **增量而非重建**:压缩前把各目标里的存量行(按配置读取,30 库 35 服量级无压力)与知识条目标题作为「已有知识状态」注入 prompt,模型只输出新增或修改的行(修改 = 主键不变、只填变化字段,留空 = 保留原值)。 - **note skill(vault 限定记录约定)**:`noteSkill` 指向任意 vault 内 markdown,内容注入给模型当本 vault 约定(命名习惯、必标注字段……);格式仍由代码强制。 - **备份默认关闭**:vault 由 git 管理时版本历史即兜底,不再产生裸露 `.bak`;`noteBackup: true` 可开启——修改前备份进 `.backup/` 隐藏目录(保留相对路径 + 时间戳,多次不覆盖;新建不备份,修改才备份),目录已加默认扫描排除。 - 其他:`noteStructured` / `noteSkill` / `noteBackup` 为 vault 限定键,GUI 保存的双写同步原样保留;对话转写带总预算(16 万字符保头保尾)与单条截断(工具结果 1500 字符);区间边界利用命令生命周期日志定位,`/ml note` 自身不进任何区间,转写过滤注入块与压缩检查点;宿主新增 `llm` 硬依赖(与官方 compaction 同款,`ctx.llm.stream` 旁路调用)。`/ml note` 误带文字时明确提示「文字没有发给助手」并给出正确用法。全套 342 个测试通过。 ## 0.11.7(2026-08-17) - **README 头部新增隐私警示**:任何 dsh 工作目录都能把笔记写进同一个 Vault,也就意味着你的领导同样容易通过蒸馏 Vault 摸清你的动态——当前请谨慎使用;「失联即焚」功能推出前务必做好云备份(甚至不要落在公司电脑上),推出之后更要做好备份防止系统自燃。 ## 0.11.6(2026-08-17) - **修复「清除 Vault 无效」**:两层原因——设置页打开期间执行过 `/ml init` 会让页面持有的版本号过期,保存撞 409 后旧逻辑把表单刷回服务端旧值;且「清除」原本只改表单草稿、要再点「保存」才落库。现在 409 自动拉取新版本号重试一次(整段替换语义下,覆盖即用户意图),且「清除」按钮**立即保存生效**(不等「保存」)。 - **设置双写**:GUI 保存与 `/ml init` 现在把同一份设置同时写入全局(`~/.dsh/settings.yaml`)与 Vault 内的 `.memoryleak.yaml`(每次覆盖同步)。vault 路径键只住全局层——vault 文件里写 `vault:` 也会被读取端剥离、写入端剔除,不允许 Vault 决定自己在哪里。 - **修复 `/ml init` 目录候选导致屏幕抖动**:候选列表从卡片内(输入框下方、撑高布局)改为悬浮弹层,向上展开(对齐 `/ml view` 候选卡的展开方向),输入区高度恒定;请求期间保留旧候选,不闪不跳。 - **Enter 智能补全**:输入未以 `\` / `/` 结尾且有候选时,Enter 先补全(同 Tab);以分隔符结尾或无候选时 Enter 确认目录。 - **Windows 正斜杠路径兼容**:目录补全改用 node:path 的平台实现,`e:/niuwowo/M` 这类正斜杠输入与反斜杠等价(此前 `e:/x` 形式会被切出不可靠的父目录导致无候选)。 ## 0.11.5(2026-08-17) - **修复 Vault 未设置时的命令行为(严格化)**:之前任意命令都会自动弹目录引导,在快速打开、命令菜单等入口下行为不可预期。现在 `/ml init`(新增,不带参数)是唯一严格的设置入口——弹目录选择卡(Tab 补全 + 「浏览…」系统对话框)指定或更换 Vault(已设置时提问显示当前值);**其余命令在未设置时直接报错**并提示「先执行 /ml init」。快速打开面板的「初始化」条目同样改为执行 `/ml init`。 - **补上设置页 Vault 行缺失的「清除」按钮**:一键置空 Vault 目录(保存后生效,之后命令回到「先 /ml init」状态)。 ## 0.11.4(2026-08-17) - **目录选择全面改用官方能力(撤掉自造 PowerShell 方案)**:设置页「浏览…」与 Vault 引导卡新增的「浏览…」按钮都走官方 `workspaces.pickDirectory`(宿主组合的 directory-picker 后端负责跨平台:Windows/macOS/Linux 各按系统方式弹窗)。自造的 `POST /api/memoryleak/pick-directory` 路由与 PowerShell 脚本整体移除——此前的「点击无反应」正是那段脚本的语法错误所致,与其修平台脚本不如不维护平台脚本。 - **修复菜单选中 `/ml` 后无下文**:Vault 未设置时快速打开面板给一个「初始化 Vault 目录…」条目,选中即执行 `/ml view` 触发引导(不再空面板卡住);候选拉取失败同样走该条目。 - **修复设置页 Vault 行溢出**:改为块级布局——标签与说明在上,「浏览…」+ 输入框一行占满(输入框弹性收缩),窄面板不再出现横向滚动条。 ## 0.11.3(2026-08-17) - **修复「浏览…」按钮点击无反应**:目录选择对话框的 PowerShell 脚本误用了 C# 的 `::Write` 语法(PowerShell 要用 `.Write`),整段静默失败。重写脚本:修正语法、输出前设 UTF-8 编码(中文路径不乱码)、对话框挂 TopMost owner(不弹到所有窗口后面)。 - **修复 Vault 未设置时命令菜单选 `/ml` 直接报错**:快速打开面板拉不到候选(400)会把整条命令拦住,引导卡因此永远不出现。现在候选拉取失败一律返回空列表——面板空着,手输 `/ml <文本>` 回车照常触发 Vault 引导。 - **修复设置页 Vault 行布局溢出**:「浏览…」按钮被 flex-grow 布局推出可视区、需要横向滚动才能看到。改为与其他设置行一致的固定宽度排列。 ## 0.11.2(2026-08-17) - 修复:Vault 目录补全的 `E:`(带冒号的盘符)形式拼出 `E::\` 双冒号,导致该形式无候选——现在正确规范化为 `E:\` 并列出其子目录。 ## 0.11.1(2026-08-17) - **Vault 引导不再裸手输路径**:`ml-vault` 提问改为专用目录选择卡——路径输入框 + 实时候选列表(列出当前目录下的子目录),**Tab 补全 / ↑↓ 换高亮 / Enter 确认 / Esc 取消**;支持 `~` 开头(用户目录)与 Windows 单字母盘符探测(输 `e` 补全 `E:\`);「当前会话的工作区」快捷按钮保留;路径不存在时 Enter 仍可确认(宿主自动创建)。 - **设置页 Vault 行新增「浏览…」按钮**:一键打开系统目录选择对话框(Windows 为原生 FolderBrowserDialog),选中即填入;取消静默,非 Windows 平台回退手动输入。 - 新增 `GET /api/memoryleak/path/complete`(目录补全候选,读失败静默空)与 `POST /api/memoryleak/pick-directory`(系统对话框结果透传)两条路由。 ## 0.11.0(2026-08-17) - **Vault:统一存放目录,不再跟随会话工作区**:新增 `vault` 设置(默认空)。刚安装时执行任意 `/ml` 命令(help 除外)都会弹一次性引导——输入本地文件夹路径或直接选当前工作区;目录不存在会自动创建。设置后所有日志、待办、`/ml view`、快速打开都以 Vault 为根,换项目换会话记的事都在同一处。Vault 也可在 GUI 设置里直接填写。 - **设置分两层**:全局层仍是 `~/.dsh/settings.yaml` 的 `memoryleak:` 段(DSH 官方统一位置);选定 Vault 时自动把当时的设置复制为 Vault 内的 `.memoryleak.yaml`(已存在则保留)。之后 vault 文件里的键优先级更高(整个 Vault 拷到别的机器,设置跟着走);缺键回退全局层,再回退默认值;vault 文件损坏按缺失处理,不崩。 - `/api/memoryleak/files` 改按 Vault 定位(不再需要 session 参数);宿主 inject 相应收窄(去掉 sessions)。 ## 0.10.2(2026-08-17) - **`/ml todo add` 首轮选完即提交**:类型 + 重要程度两问在 web 端合并为一张卡,各点一项,第二项选中的瞬间自动提交——通用问答 UI 里最后一题选完还要点一下「提交」的步骤没有了(先选重要程度再选类型同样成立;补全前随时可改选)。提问 id 同步命名空间化(`ml-type` / `ml-prio` / `ml-date`),客户端只认领自己的问题,不影响其他插件的问答。 - **`/ml todo add` 日期选择器**:deadline / sleep 的日期轮在 web 端不再手打 yyyy-mm-dd——接管输入区渲染「日历 + 快捷键(今天 / 明天 / 本周 / 本月)」,点击即确认,Esc 取消;本周=本周日、本月=当月最后一天(周一起始)。其余环境(TUI/原生)仍走自由输入,答案与校验不变。 - **待办完成时间**:`/ml todo d` 完成一条待办时,自动在文件里记上完成日期(`done:2026-08-16`),列表徽章显示 `✓2026-08-16`;取消完成或 `u` 撤销时自动清掉。已有文件不用改,下次操作自然写入。 - **待办列表排版**:长文本换行后从正文位置对齐(不再顶到行首);已完成的条目置灰加删除线;纯文本输出格式不变,TUI 场景不受影响。 - 删掉 README 英文版链接,README 重写为面向使用者的说明。 ## 0.10.1(2026-08-16) - **快速打开候选:当前日志/周志默认置顶**——空片段时第一项即当前文件(按设置的日志模式定位),带「· 当前」标记;不存在也显示,选中即经宿主创建路径查看。 - 重写 README(场景导向 + 完整命令表 + 文件格式约定 + 生效方式表),新建 CHANGELOG。 - 修复:`/files` 路由的 `dailyFileName/weeklyFileName` 误从 journal.js 导入导致宿主加载失败(改自 core/journal.js)。 ## 0.10.0(2026-08-16) - **`/ml view <片段>` 手动输入时的实时候选卡**(combobox 模式):官方 popupSelect 只在从命令菜单选中 `/ml` 时触发,手动输入无任何备选 UI——自建 `conversation.input.overlay` 槽候选卡,监听草稿匹配 `/^\/ml\s+(view|v)\b/` 即弹出;焦点留在输入框,打字实时过滤(本地子序列评分)。 - 键盘(capture 拦截):↑↓ 切高亮(默认第 1 项)、Tab 补全文件名进草稿、Enter 直接执行并清空输入框、Esc 关闭;IME 组合输入不拦;候选空时 Enter 放行给宿主模糊解析兜底。 - 多候选场景(如 `08-1` 命中两天)现在直接在卡里选择,不再落到 error 文本。 ## 0.9.x 修复(2026-08-16) - **候选卡错位与报错(两连修)**: - 错位:overlay 锚点是 `display:contents`,文档流内联块掉进对话列——对齐官方 MenuView 定位契约(`position:absolute; bottom:calc(100%+4px)`),视觉令牌同步官方菜单。 - 报错 `cannot get property "sessions" without inject`:候选卡 fetch 的 `/files` 路由在**宿主侧**访问 `ctx.sessions` 但宿主 inject 未声明(Cordis Guard 在属性访问时拦截,测试桩无 Guard 测不出)——宿主 inject 补 `sessions`。 - **新增回归守卫**:扫描宿主源码全部 `ctx.` 访问,逐一断言在 inject 声明中——与此前 `agent.id`(ASK_MISSING_AGENT)同类缺口从此静态锁死。 ## 0.9.0(2026-08-16) - **`/ml view [片段]` 模糊快速打开**: - `core/fuzzy.js`:子序列评分 DP(边界 +3 / 连续 +4 / 跳过 -0.1 / 短候选折扣),测试锁定「连续运行 > 散点命中」。 - `resolveViewTarget` 四态解析:exact(完整文件名/去扩展名唯一)/ unique(强匹配直接开)/ ambiguous(列候选要求加长片段)/ none。 - `GET /api/memoryleak/files?session=`:按会话定位工作区返回文件清单(新文件在前)。 - 客户端 `commandUi.decorate(/ml)`:从命令菜单选中 `/ml` 时弹官方 popupSelect 快速打开面板。 ## 0.8.0(2026-08-16) - **`/ml view`**:无参数显示当前日志/周志(未创建友好提示,不自动创建)。 - help 补全 `add`/`list` 全称(此前只有 `n`/`l` 简写主条目,搜不到全称)。 ## 0.7.0(2026-08-16) - **别名**:`/ml todo n`(add)、`/ml todo l`(list)、`/ml h`(help)。 - **`/ml help`**:命令一览汇总(纯函数 `renderMlHelp`,测试断言覆盖全部已注册命令且不含未实现命令);无工作区绑定也可查看。 - 注册描述改为一句话导向 help:`MemoryLeak 记事本 · 输入 /ml help 查看全部命令`。 ## 0.6.0(2026-08-16) - **list 去掉行号列**(与序号混淆;序号仍是 `d` 的唯一寻址键)。 - **`/ml todo u`(undo)**:撤销最近一次 `d`,LIFO 可连续;撤销前严格校验该行未被外部修改(d 时捕获行内容,变化即拒绝);按会话隔离。 ## 0.5.0(2026-08-16) - **sleep 到日自动唤醒**:`list` 时把到日、未完成的 sleep 行在源文件转写为 `active` 新类型(文件+行号+raw 三重校验,行变化跳过;单文件故障隔离);列表尾显示 `☀ 已唤醒 N 条`;徽章 `[唤醒·中等]`。 - **`/ml todo d `(done)**:按最近一次 list 的序号切换完成态;序号是 list 作用域的;未 list 先 d 报错提示;超界报错;快照按 agent 会话隔离。 ## 0.4.1 修复(2026-08-16) - `/ml todo add` 提问请求携带 `agent`(修复 `web user interaction requires an agent-owned session`):web Provider 依赖 `request.agent.id` 路由弹窗到正确会话;加回归断言每个 ask 请求必须有 `agent.id`。 ## 0.4.0(2026-08-16) - **`/ml todo add <文本>`**:固定表单(userQuestions)两轮提问——类型(deadline/sleep/anytime)+ 重要程度(紧急/中等/低),deadline/sleep 追问日期(yyyy-mm-dd);全程无 LLM。 - **结构化待办格式**(第二个 Strategy:`memoryleak-todo`,priority 50 先于 markdown-checkbox):`- [ ] (ml:[ ] ) 文本`;属性块损坏自动降级为普通待办。 - TodoItem 携带 meta;列表徽章 `[截止 2026-09-01·紧急]` 等。 - **sleep 语义**:`list` 默认隐藏未唤醒的 sleep(唤醒日含当天即显示),`all` 显示全部。 - `## Todo` 模块插入算法:永远建在 `## MemoryLeak` 之后(两者皆无则一并创建)。 ## 0.3.x(2026-08-16) - 0.3.1:恢复 `/ml` 命令卡片默认展开视图(`conversation.chat.commandview` key=ml,记录与待办两家族共用)——此前因「空结果不显示」误撤,后确认那是 blank 会话无时间线的上游行为,与槽位无关。 - 0.3.0:**`/ml <文本>` 记录命令**——写入工作区日志/周志的 `## MemoryLeak` 模块;ISO 8601 周(含跨年/53 周边界);模板占位 `{date}{week}{start}{end}`;模块插入算法(daily 平铺 / weekly 按日期分组子列表;头部 `start:/end:` 配置块与一级标题保留;输出统一单换行结尾);设置新增 journalMode/dailyTemplate/weeklyTemplate。 ## 0.2.x(2026-08-16) - 0.2.1:品牌文案统一为 **MemoryLeak**(不翻译)——设置分区 label、命令描述前缀、README/DEVELOPMENT 同步。 - 0.2.0:更名 `dsh-notes` → `dsh-memoryleak`;命令统一 `/ml` 前缀(新文法 `/ml todo list [all|open|done] [关键词]`,`/ml todo` 省略操作默认 list);设置段 `notes:` → `memoryleak:`;API `/api/notes/*` → `/api/memoryleak/*`。 ## 0.1.0(2026-08-16) 首个可用版本: - **设置窗口**:GUI 设置面板「MemoryLeak」分区(扫描扩展名/排除目录/上限/默认过滤词),持久化 `~/.dsh/settings.yaml` 的 `memoryleak:` 段,乐观并发(409 重载提示)。 - **`/ml todo list`**:扫描工作区 Markdown 待办(`- [ ]`/`- [x]`,围栏代码块不计入),TUI 排版(分组头/序号/选票符号/警告块)按文件分组返回;状态与关键词过滤。 - **架构**:纯域(`src/core/` 零依赖)+ 双适配器(node/memory FileSource,共享遍历策略)+ 宿主/浏览器双半;Strategy/Registry/Specification/Value Object/Ports & Adapters/组装根;let-it-crash 故障分级(程序员错误启动崩溃 / 用法错误用户可见 / 环境故障隔离上报);110 个测试。