# 变更日志

本文件记录本项目的所有重要变更。

格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)，版本号遵循[语义化版本](https://semver.org/lang/zh-CN/)。

- 只想看「大致改了什么」→ [版本更新概要](docs/UPDATE.md)
- 功能说明与用法 → [README](README.md) / [README_EN](README_EN.md)
- 工程细节（根因分析、实测数据、设计取舍）在 git 历史里，不在这里。

---

## [0.22.0] - 2026-11-04

### 变更

- **适配宿主 0.2.2-rc.1**：兼容范围改为 `>=0.2.2-rc.1 <0.2.3`，`engines.dsh` 与 11 个 `@deepseek-ai/dsh-*` peer 同源；0.2.1 及更早的宿主请装 0.21.x。
- **宿主适配代码无需改动**：工作区登记表、会话、投影缓存、设置、预设名册、工具服务、连接准入的成员面与 0.2.1 一致，0.2.2 的新增项均为可选参数或新方法（`tools.register` 的准入选项、`executable` / `resolve`、文件服务的 `deleteFile` / `move` / `patch`）。
- **最低 Node 版本提到 24.9**：跟随宿主自身的最低运行时要求。
- **开发依赖跟进 Cordis 4.1.0**：`symbols.original` 与事件注册签名未变。
- **兼容矩阵按 0.2.2-rc.1 重生成**。
- **设置侧栏图标改走官方 `settings.section.icon` 插槽**：0.2.2 把导航图标包进 `span.navIcon`，旧的「CSS 藏宿主 svg + `::before` 画图」接管法失配，导致「工具管理」一行并排出现叠方块与齿轮两个图标；改用宿主插槽后整段 DOM 接管（样式 + MutationObserver）删除。
- **删除 12 个全仓零引用的导出**：boot 的两个测试钩子、`projectRootOf` 包装层、`SCOPE_MODES`、`isScopeDomain`、`SUBSTITUTED_CAPABILITIES`、`requireRoute`、`BARE_HOST_MODULE_NAMES`、`TOKEN_CODE_NO_HOST`、`hasSection`、`REGISTRY_URL`、`quarantineMcpRestartMarker`。
- **MCP 重启标记的 pid 判定改名 `pidLikelyAlive`**：与 hub 锁对非法 pid 的相反默认值区分开，避免被当成重复实现合并。
- **子智能体服务缺失的报错不再写死宿主版本**：改从兼容范围常量派生；README 徽章同步到 0.2.2。

## [0.21.9] - 2026-10-30

### 新增

- **`host-deps` 可指定宿主目录**：`--host <dir>` 让链接指向非默认安装的宿主；`doctor` 打印宿主位置与版本。

### 修复

- **兼容页在全局 npm 等安装形态下误报「两份不同拷贝」**：宿主发现改为按包内清单校验，支持全局 npm 的嵌套布局与正在运行的宿主进程；`doctor` / `host-deps` 同步这一口径。
- **插件装配失败不再拖垮宿主启动**：`apply()` 整体兜底，任一步抛错只记一条降级并保留已注册的部分；官方内置技能的物化推迟到首次取用，装配期不再同步拷贝宿主安装目录。
- **官方内置技能的接管不再依赖 rank 数字**：全局层交给宿主自己的 provider，插件只在每个 agent 的 scoped 层注册候选，按「最近一层胜出」接管；官方调整 provider 档位时启停不会静默失效。
- **对齐宿主 0.2.1-rc.5 的官方内置技能清单**：新增 `office` 路由与 `office-render` / `office-recalculate` / `office-export-pdf` 三个操作技能；LibreOffice Kit 段改挂这三个操作技能，`skill_manager_read` 读取时同样补上。

### 变更

- **LibreOffice Kit 段按正文判断**：不再写死技能名，SKILL.md 正文提到 LibreOffice 才补段；路径不可用时在兼容页留一条降级。
- **官方技能源按形态校验**：只要求「子目录 + SKILL.md」，不再点名 `office-docx` 或固定清单，官方增删技能也能整目录接管。
- **`@deepseek-ai/*` peer 改为可选**：宿主缺某个包时安装不再被拒，运行期按能力探测降级。
- **适配宿主 0.2.1-rc.5**：兼容范围同步收窄到 `>=0.2.1-rc.5 <0.2.2`。

## [0.21.8] - 2026-10-28

### 新增

- **检查更新给出可复制的升级命令**：有兼容更新时点击更新键弹出升级卡，展示固定到该版本的 `dsh plugin ... add ...` 命令；复制到终端执行并重启 DSH。命令不使用 `@latest`，也不在界面内自动安装。
- **更新检查跟随宿主的下载源**：按宿主登记的源（配置的第一源 + fallback，含镜像）依次请求，并用宿主的双源测速决定先问哪个；不再写死 npm 官方源。
- **更新检查不再丢弃显式配置的私有源**：冷启动时不再因为等待宿主解析源超时而退回 npm 官方源。
- **更新检查加固**：跳过 registry 上被标记为 deprecated 的版本；registry 响应加 8 MiB 流式上限；`host-unknown` 按失败缓存 1 小时；缓存读数按当前 profile 重建命令。
- **档案同步不再复制演示视频**：`docs/videos`（约 97MB）不进入 profile，已有副本会在下一次构建时清掉。
- **web / desktop 同时运行时不再互相覆盖侧车**：hub 写入加跨进程文件锁（`.write.lock`），停用表 / 作用域覆盖 / 工具表不会被后写的进程整份盖掉；进程崩溃留下的锁最多挡一分钟。
- **作用域侧车损坏可修复**：作用域条出现写入错误时可点「修复作用域文件」，确认后把损坏文件改名留存、按空表继续，不再只能手删。
- **技能 / 来源意图随资源删除清理**：对账时清掉已不存在的技能与技能来源的全局意图，同名资源重建不再继承旧的 off / blocked。

## [0.21.7] - 2026-10-27

### 修复

- **面板在对话进行中持续闪烁**：宿主会话清单变动改为静默刷新（不立 loading、内容未变不写状态），提示词 / 记忆页不再跟着整份重取。

### 变更

- **空清单的 MCP 状态段改用长间隔重算**：MCP 注入域开启但没有服务器时，后台不再每 3 秒全量枚举一次，改为 60 秒确认一次；事件驱动的刷新不受影响。

## [0.21.6] - 2026-10-24

### 修复

- **修好「应用提示词预设」恒定失败**：全局 AGENTS.md 存在时，并发编辑校验误拿文件正文当指纹比对，应用必被拒；补签发 / 校验同口径回归测试（#22）。
- **记忆附件落盘补根内断言**：场景 / 记忆目录是指向根外的链接时，附件上传拒绝写入（与同域其余写路径同口径）。
- **保留期自动清理技能条目先送系统回收站**：失败才永久删除，与手工删除同一道保险。
- **场景锁定 / 切换 / 建档后冻结判定即时生效**：成功操作立即刷新缓存，不再有 1 秒旧状态窗口。
- **人设名单字段逐条转义**：`tools` / `toolsDeny` / `toolsByPreset` 里含逗号、冒号、引号或换行的名字保存与回读不再变形，也无法借名单写出额外 frontmatter 键。
- **三处改名写入改为可重试**：提示词预设、快捷提示词、人设保存在 Windows 瞬时占用下不再直接失败。

### 变更

- **场景冻结口径统一**：场景回收站的永久删除、被锁场景自身记录的编辑纳入冻结；新建场景不受影响。
- **README / README_EN 补写访问令牌与进程级边界的关系**：宿主栅栏缺席时写接口只拦远程请求，进程级边界需配置令牌。
- **适配宿主 0.2.1-rc.3**：验证版本与安装期范围下限升至 `0.2.1-rc.3`（上界 `<0.2.2` 不变，仍只声明这一代），兼容矩阵按新基准重生成。

## [0.21.5] - 2026-10-23

### 新增

- **错误消息附带现成候选**：缺 id、缺场景名、缺服务器名、名字打错时，列出当前存在的记忆 id、技能名、人设名、场景名、预设 id、MCP 服务器名。

### 修复

- **人设清单带正文路径**：`list` 每条末尾给出人设文件路径，要读完整定义时用文件工具打开。
- **MCP 重启的豁免范围写清**：只豁免场景锁，不豁免用户同意。
- **十处写操作补上确认卡**：MCP 停机、提示词正向应用、五域删除进回收站、记忆 / 技能 / 人设的开关落到机器级时；恢复路径（MCP 重启、回收站还原、提示词撤销）不拦。
- **回收站还原缺 id 时说明那是回收站条目 id**，并指向 `action=list`。
- **记忆 id 传到其它域时说明那是记忆 id**。

### 变更

- 错误消息里点名其它工具时按可见性分叉：模型手里没有那条工具就只指向注入段。

## [0.21.4] - 2026-10-23

### 新增

- **技能可编辑**：行菜单新增「编辑」，可改简介与正文，名称只读；官方内置与只读来源不提供编辑 / 删除。
- **页头「全部关闭」**：场景 / MCP / 技能 / 子智能体 / 提示词 / 记忆六页在存在临时运行时出现，一次清掉这一域全部临时运行，执行后按钮随即消失。
- **行菜单「统一关闭」**：场景、子智能体、记忆、快捷提示词也支持逐条清掉其他对话 / 工作区的临时运行；有租约时才出现，带确认弹窗，场景只退出进入过这一场的对话 / 工作区。

### 修复

- **统一关闭后「临时运行」徽章不消失**：现在会立即消失，不需要刷新页面或等待下一次同步。
- **统一关闭导致列表重排**：关闭操作不再重拉整层，已打开的条目保持原位，不会把已启用的全部置顶。
- **MCP 行上长期挂着「已彻底停止」标签**：标签与菜单里的「恢复启用」一并去掉，旧的持久停机记录直接拨开关即可恢复。

### 变更

- **「彻底停止」改为「统一关闭」并改为一次性**：关闭后不留下持久停机状态，之后可以重新打开。
- **页头批量按钮统一改为「全部关闭」**：放在「回收站」右侧，红色边框与红色字体。
- **技能来源卡片去掉逐条「彻底停止」**：关闭来源只改默认，正在使用它的对话 / 工作区按租约继续；需要立即切断时用页头「全部关闭」。
- **兼容页移除更新检查行**：需要时点右上角更新按钮；那颗按钮始终只查一次，不再跳转兼容页。
- **「保存到场景」改为「保存」；技能页「创建技能」改为「创建」**。

---

## [0.21.3] - 2026-10-22

### 新增

- **启动时修剪桌面壳的鉴权 cookie**：桌面端每次启动换一条 `dsh-auth-*` 却不清理旧的，堆到几十条后 welcome 握手会被拒（表现为「Web authentication failed」、应用起不来）；现在装配期清一次，只动 `127.0.0.1` 上该前缀的行。
- **`npm run check:strict`**：按目标清单判定 `noUncheckedIndexedAccess` 是否清零，清单外的错误只计数不阻塞。
- **op 登记表对账新增「无分类标志」一项**：有条目却一个分类都没声明的 op 现在会被查出来。
- **注入一条「设置写在哪一层」**：工具 schema 是静态的，`scope` 参数三档并列写着，模型读不出自己正处在哪一档，于是回执和描述只能同时讲三种情况。现在注入的六个域里有**一条**消息在标题下多一行当前粒度（优先挂「场景」，其次「记忆」；`delta` 那条不挂），切档时自动重发。约 10–15 tok/轮，全轮只付一次。

### 修复

- **插件升级后旧框架文案不刷新**：已有对话里的注入引导语停在旧版本，现在升级后各域补发一次。
- **旧版本留下的注入消息不补发**：升级前的消息被当成「内容没变」，现在会补发一次。
- **MCP 启动 / 重连时两次注入**：启动窗口里先发一条「已清空」、连上后再发一次内容；现在窗口内不发，超过宽限期仍如实清空。
- **只改大小写的重命名会让文件在 profile 里消失**：Windows 与默认 macOS 的文件系统不区分大小写，`docs/update.md` → `docs/UPDATE.md` 这类改名后，复制那步写穿的还是旧文件、清理那步又把它当成陈旧文件删掉，一次构建的净效果是文件不见了（要跑第二次才补回来）。现在同步前先按「忽略大小写同名」清掉旧名。
- **请求栅栏可能永久停在降级档**：宿主的 `connection` 服务在路由注册之后才挂载时，那个 `undefined` 会一直留在闭包里，此后每个请求都只走本地回环判定（没有浏览器会话鉴权）。现在按请求现取。
- **更新检查的「复制安装命令」指向更旧版本**：本地版本比 registry 最高兼容版还新时，那颗按钮给的命令 pin 的是 `bestCompatible`（更低），点下去等于引导降级；该行连同按钮一并去掉。
- **模型工具表里 `memory_manager_search` 一格空白**：行内与悬停两档文案补齐（中英）。
- **`memory_manager_list` 把 `_shared` 的记忆标成「场景未启用」并默认藏起来**：`global` 与 `_shared` 两个保留桶都恒常注入（注入侧无条件把它们放进生效集合），而列表只认 `global` —— 于是每条都在上下文里的公共基线记忆，在名单里被标成没启用、默认还看不见，模型照它回答「没有这条记忆」。现在两者同口径，`injects from:` 那行也在有这类条目时才点名 `_shared`。
- **「全部全局」粒度下旧会话的提示词覆盖仍在生效**：切到全局后侧车里的旧会话记录仍然留着（切回来还要用），而取提示词作用域时退回真实会话 id 去读它 —— 判定侧（`promptOverrideActiveOf` / `promptBaselineDivergedOf`）在全局档一律按「没有覆盖」算，两边自相矛盾：同一个全局设置下，这个对话按它当年钉的场景 / 覆盖走、别的对话按全局走。现在全局档不读会话层。
- **按工作区隔离时，会话层回执把影响范围说反了**：原文写「别的对话不受影响」，而那一格由同工作区的对话共享；现在按当前粒度分别说「这个对话」或「这个工作区」，六个域统一。
- **`mcp_manager_list` 不认逐工具的会话开关**：本作用域关掉的 MCP 工具在清单里仍报开着（`mcpm-tools` 读的是全局停用表），现在按四层并值投影，两层不一致时才加限定词。
- **`*_save` 的回执可能指向这个作用域里没有的工具**：点名 `*_switch` 前改用按 agent 判的可见性（工具表是每个作用域一份）。
- **`prompt_manager_apply` 在钉住别的场景时不吭声**：现在说清改的是机器级那个场景、本作用域看到的没变，并给出改绑定的路径；回执里的场景名也改成名字（显示名另附）。

### 变更

- **删掉工具依赖里的 `toolVisible`**：它只读全局开关，在「工具表按作用域各一份」之后必然误判，点名处已全部走 `toolVisibleFor`。
- **`scene_manager_save` 的描述压缩**：去掉档案里装哪些东西的枚举（回执本来就逐节报），只留「进入时开它列出的、其余全关」这一句判据。
- **`scope` 参数不再用内部术语**：`lease` / `state file` / `memory index` 这类实现词换成「这个作用域」「全局」的说法，描述里不再出现模型看不懂也查不到的构件名。
- **删除过期与孤儿注释**：两段从未生效的文档块、代码搬走后留下的说明、粘在上一行末尾的注释。
- **四个解析器在严格索引检查下清零**：SKILL.md frontmatter、`cordis.patch.yml`、记忆发现、按约定发现的来源。
- **HTTP 入口的 `args` 只接受普通对象**：字符串 / 数字 / 数组 / null 一律归一为空对象。
- **四条只读 op 补上显式 `readonly`**：`mcpm-list`、`skill-state`、`subagent-list`、`agentsmd-list`。

---

## [0.21.2] - 2026-10-22

> **本次重点：生效层级。** 设置不再只有一份 —— 每个对话默认各有一份，兼容页可切「全部全局」（所有对话共用一份，即加会话管理之前的样子）或「按工作区」（同一工作区的对话共用一份）。全局关着的服务器与技能来源，本对话要用时临时运行，别的对话看不见。

### 新增

- **生效层级可选**：兼容页可切「全部全局 / 按工作区 / 按会话」，默认每个对话各一份设置，切走时已有记录保留。
- **按对话隔离**：本对话改过 > 进入的场景 > 创建时的快照 > 全局，逐格叠加。
- **全局意图与租约运行**：全局开关只表达「默认要不要」；本对话要用全局关着的服务器 / 技能来源时临时运行，行菜单可「彻底停止」。
- **六个域都能按对话单独设置**：逐工具开关、技能来源、模型工具表、提示词、记忆、子智能体，带「N 个对话单独设置」徽章。
- **对话里进出场景**：进入按档案实时生效，退出回到本对话创建时的样子。
- **会话锁 / 工作区锁**：只冻结当前层的写入，与场景锁互不干扰。
- **记忆搜索工具**：`memory_manager_search` 按名字 / 场景 / 描述 / 标签 / 正文搜，出厂默认关闭。
- **记忆索引一键修复**：索引被隔离后，场景页给一颗修复按钮。
- **开机自检**：启动时核对上个进程有没有留下没干完的状态，并在场景页列出。
- **并发编辑指纹**：文件在编辑期间被别人改过时拒绝写入，弹窗给「重新加载 / 覆盖保存」。
- **插件更新检查**：兼容页与面板右上角都能查，按宿主版本挑兼容版本、给确切版本的安装命令，从不自动更新。
- **诊断信息一键复制**：插件 / 宿主版本、平台、数据目录与各类计数拼成一段纯文本，不含密钥与正文。
- **兼容矩阵**：`node scripts/compat-matrix.mjs` 输出各宿主 × 能力的静态矩阵到 `docs/COMPATIBILITY.md`。
- **三份文档**：故障排查、架构、兼容矩阵。

### 修复

- **MCP 停用表写坏后静默失效**：损坏时所有 `mcp__*` 拒绝调用，兼容页报降级并给「重置停用表」。
- **服务器名含 `__` 时停用工具可能漏拦**。
- **MCP 改名中途失败留下半套状态**：失败时回滚，回滚不了就如实报残留。
- **MCP 批量开关静默跳过失败项**：全部失败回 `ok:false`，部分失败列出哪几层没改成。
- **MCP 列表把明文 env / headers 显示出来**：列表一律打码，只有明文接口才给真值。
- **MCP 注入段把没连上的服务器常驻进上下文**：只有此刻真有工具注册的服务器才进段。
- **模型工具表侧车损坏时关掉的工具复活**：损坏时沿用上次成功值并拒绝保存。
- **模型工具表并发改写丢更新**。
- **导出落盘失败仍回「成功」**：改为如实回失败并带上原因。
- **用户内容写盘可能留下半截文件**：提示词、快捷提示词、人设启停与回收站保留期改原子写。
- **frontmatter 里的引号与未知字段被吃掉**：编辑记忆只替换名字、描述与正文，其余原样保留。
- **令牌覆盖条目在空补丁 `[]` 上写出非法 YAML**。
- **环境变量供令牌时一直误报「待重启」**。
- **关闭 / 删除令牌时提示「令牌不对」却无处输入**。
- **注入 / 斜杠设置保存失败仍显示成功**。
- **可见性 / 执行守卫的降级不出声**。
- **原型链上的同名属性冒充已登记操作**：未知操作一律 404。
- **悬空符号链接可绕过根内断言**：写不出根外。
- **快照 zip 没有解压限额**：条目数、单条字节与累计解压量都设上限。
- **记忆索引清理可能删掉本该保留的条目**：扫描不完整时不再清理，改为上报。
- **「已清空」通知挡住后续注入、且每轮重复**：只在状态刚变时发一条。
- **长对话反复播报「工具已更新」**。
- **空闲时 CPU 持续偏高（issue #21）**：工具事件密集时，MCP 状态段不再逐条全量重算，合并到 2 秒一窗。
- **切到「按工作区」后场景勾着却不注入**：播种不再把「已退出场景」带进新层，新工作区从「跟随全局」开始。
- **插件重载可能留下技能目录监听**：卸载与「读自定义目录」撞车时，晚挂上的监听当场收掉。
- **会话摘要缓存无上限**：改为 200 条 LRU，长期运行不再累积。
- **极简预设下项目 `AGENTS.md` 丢失**：没挂官方指令行时插件自己把项目指令链送进上下文。
- **兼容页把「两份拷贝」算成可用**。
- **深色模式页签条与页面不同色**。
- **侧栏页内容一长页签浮在半空**。
- **dsh web 上工具管理面板所有接口报「调用方不是本机所有者身份」**。
- **退出场景后「取消应用」不可用**。

### 变更

- **访问令牌区收成两行**：令牌行与保护开关并排，配置改了没重启时显示「待重启生效」。
- **删除令牌同时清掉本机记录**：只清本机改用「锁定」。
- **全局提示词改为会话冻结快照**：每个对话首次注入时冻结当时的 `~/.dsh/AGENTS.md`，之后只影响新对话。
- **模型工具默认写本对话**：`*_manager_switch` 与场景 / 快捷提示词写入默认只影响当前对话，`scope: "global"` 才改全局。
- **场景点开着的那一个 = 退出模式**：不再有「钉住」这一说。
- **面板顶部的会话下拉只列当前会话区里的会话**，分组显示真实标题，全局默认置顶。
- **作用域行与页签一起吸顶**。
- **HTTP 回执状态码对齐语义**：405 / 403 / 413 / 404 / 500，回包形状不变。
- **兼容范围收窄到 DSH 0.2.1 一代**：`engines.dsh` 与 11 个 peer 范围改为 `>=0.2.1-rc.2 <0.2.2`；0.2.0 及更早的宿主请装对应版本的插件。
- **兼容矩阵新增「未适配」态**。
- **新增直接依赖 `semver`**。
- **25 条模型工具描述瘦身**：去掉位置指引与重复的省略说明。

---

## [0.21.1] - 2026-10-18

### 新增

- **侧栏入口**：侧栏加一行「工具管理」，兼容页可随时关闭 / 开启（默认开启）。
- **插件行显示名**：中文显示「工具管理」，英文显示 "Tools Management"。

### 变更

- **「工具」改名「工具管理」**：设置分区、侧栏入口与界面指路文案一并对齐。
- **场景一条一行**：单列排列，描述固定第二行，开关与 ⋯ 右对齐。
- **来源卡头目录下移**：目录改到标题下一行，窄面板里也照常显示。
- **归档会话行放宽**：标题、目录与日期不再挤在一起。
- **会话页标题去掉加粗**：目录卡头与其余页一致。
- **令牌提示压成一行**。
- **模式横幅按钮**：「退出模式」红字红框；「锁定」加粗，悬停才泛琥珀。
- **场景卡片精简**：锁定键只在进入场景后出现在「退出模式」旁，提示词标签只留异常两种。
- **回收站详情补全**：场景与记忆补上条目信息，技能条目套用技能详情排版。
- **提示词页场景提示**：与 MCP 页同一句。

### 修复

- **MCP 备注改到编辑页**：详情页只读，并带一格空备注位。
- **MCP 关掉后状态灯立刻变灰**。
- **先打文字再打斜杠没有菜单**。
- **场景开关与 ⋯ 没有垂直居中**。
- **场景里的技能被删除后就退不出场景**。
- **归档会话行内按钮没有边框**。
- **锁定键悬停时字色变黑**。
- **回收站详情里的技能来源显示成 uuid**。
- **开关圆角与官方不一致**：方肩改为正圆角。

---

## [0.21.0] - 2026-10-17

适配 DSH 0.2.1-rc.2。

### 新增

- **提示词页显示共享的全局指令文件**：`~/.agents/AGENTS.md` 也在被注入，改这里没生效时能看出是那一份在说话。
- **兼容页功能总览新增四条宿主契约行**：子智能体人设委派、子代理工具限制、子代理创建时序、Web 连接准入 —— 这几项缺了不抛错、只是功能少一半，升级后第一眼可见。
- **兼容页新增「裸模块解析」一块**：列出插件按裸名 require 的四个官方包（MCP 客户端 / 人设 / AGENTS.md / 技能目录）与各自守住的契约标识，官方撤包或改契约从此在界面上可见，不再只有命令行能看见。
- **兼容页功能总览的依据写实**：子智能体与提示词两行改报「依赖的宿主模块在场」，不再用一句恒真的「无降级上报」糊过去。

### 修复

- **人设的工具限制不再慢一步**：改为在子代理创建时就施加，首轮工具调用前已生效。
- **面板可以挂在反向代理子路径下**：请求地址按页面地址解析，不再固定写死根路径。
- **带工具限制的 fork 委派会明确报错**，不再静默放宽权限。
- **Web 版鉴权补上调用方身份**：只有本机所有者身份的请求才会被受理。

### 变更

- **插件依赖与兼容范围对齐 DSH 0.2.1-rc.2**：兼容范围按代设上界，跨 minor 升级需同步适配。
- **doctor 不再把 `connection.admit` 误报成缺失**：该包不是插件依赖，静态检查改从宿主安装读取；宿主安装也取不到时如实报「只能对活宿主查」，而不是编一个「缺失」。
- **子智能体临时预设改为引用计数**：同一组合复用定义，失败时释放，不再在预设库里堆积。
- **允许追问的回执改说结算通知**：完成后会收到一条带着最终产出的通知。
- **子代理嵌套深度的注释修正为官方默认 1**。
- **注入到模型的模板文案改成英文**：板块标题、取代声明、补充说明、清空 / 截断 / 未列出这些提示；提示词正文首行改用官方的 `Instructions from:` 写法。场景名与说明、记忆正文、备注、`AGENTS.md` 等你自己写的内容仍原样注入。
- **模型侧的工具输出与报错也改英文**：工具回执、校验失败与警告一律英文；面板文案仍中英双语，你自己写的名称与正文原样。
- **技能、MCP、子智能体三个注入了工具名的板块补上触发条件**：写清什么时候该查这张表、什么时候该走带人设的委派；并说明取正文的工具被关掉、服务器未连接、人设不可调用时该怎么读。技能块首句补一句定义（技能是按需加载的任务指令集）。
- **场景块补一句定义**：说明记忆、提示词、工具与人设都已按当前场景筛过，不再只给场景名与说明。
- **MCP 段常驻，并补上第三档状态**：只要有一台该说的 server 就发，不因没有备注而省略；「连着但工具全被停掉」标成 `no tools enabled here`，不再与「没配过」混为一谈；说明行仍按内容发，超过上限时点名 `mcp_manager_list`。
- **记忆段的截断态改成给模型读的文案**：截断标记不再是一句 HTML 注释，未注入清单不再带字节数；真截断时不再声称「这是全部」。
- **「已清空」通知按原因分叉**：官方接管时说明是官方在送、旧内容作废；用户关掉或子会话不适用时说明这里不发送。
- **注入的首份内容不再带「取代」声明**：「同一类内容以最新一份为准」只在替换旧消息时发，「只列了启用的技能」这类边界陈述每份都发。
- **提示词块补一句效力声明**：说明这些规则要遵循、你在对话里说的优先。
- **对抗性审查收口**：场景域「this one」改「it」（兼容多场景同时启用的历史态）；提示词域「for this machine」改「right now」（场景预设接管时不是机器全局）；记忆段截断标记与折叠行不再重复；有记忆被截掉但信号放不下时强制追加标记（不再静默截断）；记忆段截断时 how 行点名 `memory_manager_list` 给出查询出口。

---

## [0.20.3] - 2026-10-17

界面与官方对齐一批：焦点环、圆角、等宽字体改用官方 token；修好 MCP 连接失败时状态灯不红、新建记忆弹窗误关丢内容。

### 新增

- **场景编辑器里「新建记忆」误关不丢内容**：30 秒内重开能填回。

### 修复

- **MCP 连接失败时状态灯是灰的**，与「未加载」分不出来。
- **焦点环会盖掉宿主「不要轮廓」的设定**（#18）。

### 变更

- **焦点环改用官方的色与宽**，鼠标点击不出环、键盘才出。
- **MCP 状态灯加载中改黄色**。
- **分组头计数只留数字**，不再带「个服务 / 项」这类量词。
- **圆角与等宽字体改用官方 token**。

---

## [0.20.2] - 2026-10-16

界面降噪一批：行尾动作收进 ⋯、没在用的分组默认折叠、会话整行可点勾选；修好折叠卡片要点两次才展开与 npm 包带上演示视频。

### 新增

- **列表行尾的 ⋯ 菜单**：编辑 / 删除这类低频动作收进去，破坏性动作在菜单里是红字。
- **会话归档列表整行可点勾选**（拖选目录文字不算勾选）。
- **记忆带附件时，在场景编辑器与记忆集里也标出来**。

### 修复

- **默认折叠的分组卡片要点两次才展开**（记忆 / 提示词 / 会话 / 技能）。
- **未启用场景卡里的开关仍显示亮绿**。
- **npm 包把演示视频一起打了进去**。

### 变更

- **没在用的分组默认折叠**：未启用的场景、一条都没开的技能来源与提示词分组、会话的工作区。
- **记忆场景卡**：计数改成「启用 / 总数」、备注显示在名称下面一行、附件标记改成回形针 + 个数挂在体积旁边。
- **技能来源的「已停用」改成灰色「未启用」**；「查看详情」→「详情」、「移到回收站」→「删除」。
- **场景卡底部那条只有编辑 / 删除的空档删掉**。
- **MCP 行不显示启动命令**；列表行第二行的几段信息之间补中间点。

---

## [0.20.1] - 2026-10-16

修好技能状态文件出错时全线停用、同名技能恢复后仍撞名与「启用这个」在同一个来源内无效；新增五个域的删除 / 回收站工具；MCP 支持粘贴 dsh 补丁片段导入；创建技能可以带附件；弹窗误关不再丢内容；一批排版与文案收短。

### 新增

- **五个域各加一条 `*_manager_remove`**（记忆 / 技能 / 人设 / 提示词 / 场景）：删除进回收站，可列可恢复。
- **`subagent_manager_list` 支持 `all=true`**。
- **MCP 详情弹窗新增「重启」与「刷新工具」**。
- **MCP 导入支持粘贴 dsh 补丁片段**。
- **创建技能可以带附件**：`references/`、`lib/` 这类资料能在界面里写，也能从本机挑。
- **弹窗误关不再丢内容**：六个域的创建 / 编辑弹窗关掉后 30 秒内重开，填回原样。

### 修复

- **技能状态文件出错时全线停用**。
- **同名技能退号恢复后仍然撞名**。
- **「启用这个」在同一个来源内无效**。
- **bundle 记忆改名丢启用状态**。
- **`mcp_manager_save` 的 `hint` 传空串清空不了已有备注**。
- **`memory_manager_read` 不返回附件清单、`memory_manager_list` 不显示 flat / bundle 形态**。
- **场景清单不印快捷提示词 id**。
- **技能导入撞名静默跳过、缺 SKILL.md 的 zip 不指原因**。
- **兼容页「模型工具表」的实发条数与 token 虚报**。
- **工具回执与目录尾句点名模型手里没有的工具**。
- **场景锁定时模型侧的报错指路界面**。
- **MCP 启动的呼吸灯要等下一次轮询才亮**。
- **未启用场景里启用一条记忆后，行首那颗状态点消失**。
- **记忆导入的「全局」显示成英文 global**。

### 变更

- **新建与恢复撞名统一改成弹窗确认后自动加后缀**（记忆 / 场景 / 技能 / 子智能体 / 提示词）。
- **新建记忆的场景改成只能选**（默认「全局」）。
- **出厂默认关掉的模型工具由 15 条调整为 19 条**。
- **`subagent_manager_save` 支持 `model` / `continuable` / `tools` / `toolsDeny`**。
- **`skill_manager_switch` 支持 `prefer`**。
- **`memory_manager_list` 的参数 `group` 改成 `scene`；`mcp_manager_save` 的 `note` 改成 `hint`**。
- **`skill_manager_list` 输出加 `preferred` / `shadowed-by` 标签；`skill_manager_read` 补上附件清单**。
- **六个注入板块的标题统一成 `当前<域>`**；兼容页工具简介统一成「动词 + 对象」。
- **一批模型侧工具描述按实际行为校准并瘦身**。
- **会话导入删掉「浏览文件夹」**。
- **删掉 `history-archive` / `history-archive-batch` 两条 op**：归档走宿主官方侧栏。
- **一批弹窗排版与文案收短**：MCP 表单等高减重、提示词与子智能体弹窗加高、场景编辑器按视口缩、三处下拉改分段控件、若干说明句删除、会话导出弹窗「归档所选」换成「全选」。

---

## [0.20.0] - 2026-10-12

修好技能回收站「目录」块的批量永久删除；记忆回收站与其它回收站统一。回收站每条可点开「详情」只读预览内容，另有一批界面打磨；`scene_manager_save` 补齐模型工具表方案 / 快捷提示词 / MCP 备注三处绑定，`prompt_manager_apply` 可取消应用。

### 新增

- **记忆回收站补上批量永久删除**：条目可勾选，「全选 / 取消全选」与「永久删除 (N)」同一行、就地二次确认。
- **回收站「详情」**：五类回收站的每条都能点开，只读预览删除的内容（文本、体积、超限截断标注），不能改、没有保存按钮。
- **MCP 导出可选目录**：导出弹窗可指定目录，并支持先预览再落盘。
- **`scene_manager_save` 可绑模型工具表方案与快捷提示词**：新添 `toolTablePreset`（省略 = 保持，`''` = 解绑，`factory-default` = 出厂默认）与 `quickPrompts`（省略 = 保持，`[]` = 进入后全部停用）两个参数；场景级 MCP 备注覆盖（`mcpNotes`）同轮补上。三栏界面早可配，模型侧此前只能看、不能写。
- **`scene_manager_list` 档案行显示快捷提示词绑定**：绑了几条、是不是「进入后全部停用」，与「工具表方案」同一口径。
- **`prompt_manager_apply` 支持取消应用**：传 `apply=false` 把 `AGENTS.md` 恢复到这一串应用开始之前的状态（那时没有文件就连文件删掉）；场景正驱动基线时拒绝，出路与界面相同。

### 修复

- **技能回收站「目录」块的批量永久删除整批失败**：报「已删除 0 条来源记录，N 条失败：unknown action」。逐条删除走的是宿主不存在的接口路径，与列表里那颗「永久删除」按钮用的不是同一个。
- **下拉菜单悬停没有高亮**：只有当前选中项有底色，鼠标移上去看不出停在哪一条。
- **横幅「填写令牌」只有下半截能点**：按钮被宿主标题栏的窗口拖拽区吃掉一截，现在整颗可点。
- **浅色主题下场景编辑器四个功能集没有分块**：与弹窗同色、融成一片白，补上描边。
- **容器边框深浅不一**：卡片外框统一一档，行内分隔线保持轻一档（配置表、技能数据元、正文框、MCP 工具卡等）。
- **技能来源「永久删除」后下一轮又回来**：改记一份彻底忘记的名单，磁盘文件不动；同名目录可重新添加。
- **`scene_manager_save` 的 `prompt: ''` 解绑不再静默失效**：空串解绑自此真正生效，回执与实际一致。

### 变更

- **各页统计框汉字与数字统一为深灰 12px、正常字重**：场景 / MCP / 技能 / 子智能体 / 提示词 / 记忆 / 历史七页。
- **记忆回收站改用与其它回收站同一套弹窗**，标题也由「记忆回收站」改成「回收站」（入口那颗按钮本来就叫「回收站」）。
- **横幅那颗键「前往」改成「填写令牌」**：点了就地弹窗填令牌、填对自动关，不再跳设置页。
- **令牌门禁提示不再重复出现**：填写令牌弹窗内与场景编辑页各删掉一遍。
- **「新建人设 / 编辑人设」改成「新建子智能体 / 编辑子智能体」**。
- **提示词新增弹窗标题改成「新增提示词」**。
- **记忆导入的「导入到场景」改成场景下拉**：列出现有场景，也保留直接输入新名字。
- **记忆行的体积标签挪到名称旁边**（药丸样式），`bundle` 形态标签不再显示。
- **回收站详情弹窗定为 720×720**：与原 S 档之间的一档，与列表弹窗一致。
- **会话页「恢复所选 / 删除所选」上移页头**，紧挨导入、导出、全选。
- **技能详情的「用系统编辑器打开」改成「编辑器查看」**，与文件路径同一行。

---

## [0.19.1] - 2026-10-10

提示词预设补上「取消应用」，删除保护与回收站一并修好；回收站新增保留期与批量删除。

### 新增

- **「取消应用」**：那颗「生效中」的开关现在能关掉了 —— 把 `AGENTS.md` 恢复成开始应用之前的状态；那时没有这个文件就把文件删掉。点之前弹窗会说清是哪种（删文件时按钮变红），点完给一条回执。
- **回收站保留期**：可选永久保留 / 7 / 30 / 90 天，超期条目由后台清扫自动永久删除，覆盖提示词预设、快捷提示词、子智能体人设、场景、技能、记忆六类。默认永久保留；改设置从此刻重新计时。
- **回收站批量永久删除**：条目可勾选，「全选 / 取消全选」与「永久删除 (N)」同一行、就地二次确认。技能回收站按上下两块各一套。
- **场景表单的「全局提示词」与「快捷提示词」各多一个「无」**；「无」是快捷提示词的第一项，也是新建场景的默认值。
- **History 页的保留期多了「90 天」**。

### 修复

- **「取消应用」回不到「没有文件」**：原本没有 `AGENTS.md` 时，连续应用 a、b 之后取消应用，文件永远不消失。
- **「取消应用」关不掉**：开始应用之前没有 `AGENTS.md` 时走不通，而界面给出的出路也不成立。
- **「只有一份预设且它生效中」时开关关不掉、删除也删不掉**（死锁）。
- **删除保护漏了一类**：当前应用的那份预设能直接删掉，删完 `AGENTS.md` 照旧生效、界面上却再没有预设对应它。
- **删光预设后又被自动重建**：删掉最后一个预设、刷新列表，同名 `default` 又回来。
- **删除后留下陈旧记录**：删掉某个预设后「最近一次应用」仍指向它，新建同 id 的预设会被误标。
- **History 页保留期静默误报**：设置值不在预设里（如 15 天）时显示成「永久保留」，其实会到期自动删。

### 变更

- **删除保护改成认两类**：场景绑定的、以及当前应用的那一份。首次打开时自动生成的那份副本仍可直接删。
- **场景表单三处文案**：「提示词预设」→「全局提示词」，「按场景勾选」→「自定义」，两条「无」改成从"这一格要不要设"的角度说话。
- **快捷提示词选「无」或「保持现状」时不再显示「本场景启用」勾选卡**。
- **回收站加高到 760**，提示词回收站拆成上下两块（各自滚动、各自一条批量条）。

---

## [0.19.0] - 2026-10-07

子智能体四件事：人设可以标「允许追问」+ 修好自 0.15.0 起完全不可用的 `subagent_manager_run` + 子代理不再把自己当成主代理 + 人设表单的「高级选项」重排；外加「工具限制」的候选修好并分三段。

### 新增

- **人设可以标「允许追问」**：勾上后子代理转后台运行，之后可继续追问。

### 修复

- **修好 `subagent_manager_run` 自 0.15.0 起完全不可用**。
- **子代理不再把自己当成主代理**。
- **修好「模型来源」选定后模型那一格变窄**。
- **注入框架不再点名被工具限制砍掉的工具**。
- **修好「工具限制」的候选不是该模式自己的工具**（此前四个模式列的是同一份宿主平面清单，勾不到 `read` / `write` / `pwsh` 这类官方工具）。

### 变更

- **串行语义改为「至多一次启动在途」**。
- **人设表单的「高级选项」重排**：五个字段分三组，提示文字由九处减到一处；模型来源与模型改为只从宿主目录里选（选定来源后模型只列该来源的；目录外的旧值原样列一条「目录里没有」，不再有手填入口）；收起态摘要最多两行、只报有值的项。
- **「工具限制」的候选按「插件工具 / 官方工具 / 其他工具」分三段**。
- **「工具限制」的候选不再返回全体并集**。

---

## [0.18.5] - 2026-10-05

会话导出分三档累进（仅正文 → + 工具 → + 思考）+ 导出弹窗放大到看得到列表 + 导入可以挑工作区；修好行内「恢复」必报操作失败。

### 新增

- **导出分三档，累进**：仅正文 → 正文 + 工具 → 正文 + 工具 + 思考，每一档都是上一档的超集。
  - 中间档是这一节存在的理由：**要工具、不要思考**。思考是模型对自己干了什么的叙述，没有工具调用就没有它叙述的对象 —— 反向那一档（带思考不带工具）没有意义，所以三档只可能是这一个顺序。
  - 附件（图片 / 文件的名字与大小）跟工具一起进中间档：它属于「对话里出现过什么」，不属于「模型想了什么」。
  - 工具结果按上限截断并写明原文总长（一次文件读取就能有几 MB），不设限的话一个会话就能导出上百 MB。
  - 附加段各自成节，且载荷整段缩进 —— 工具结果可以是任意文件内容，不缩进的话它里面的 `## User` 会在再导入时把你的轮次劈开。
  - 后两档是给人看的，不是拿来回流的：再导入时工具输出与思考会并入助手正文；要回流对话请用「仅正文」。
  - JSONL 的 `content` 仍是字符串而不是块数组 —— 块数组会让导入侧把思考又拼回正文，等于把这次修的缺陷原地复活。
- **导入会话可以挑工作区**：三条路并存 —— 从已登记的工作区下拉里选、浏览一个文件夹、直接粘绝对路径。留空仍归未分组。
  - 下拉只列活登记的那几个。「已移除」的游离目录不冒充工作区（它按定义就是没登记），要用那个目录请走「浏览」。
- **导出弹窗从 560×640 放大到 720×760**：字段由五行压成三行（格式｜导出内容 并一行、会话范围｜工作区 并一行），省下的位置全给会话列表。只有列表内滚，提示 / 目录 / 动作行常驻不动。其余四页的导出弹窗与回收站尺寸不变。

### 修复

- **归档列表每行「恢复」必弹「操作失败」**：宿主官方 `unarchiveSession` 是 `Promise<void>`，我们的门面把它的返回值原样透传，op 层再去读 `archivedSessionIds` 就抛 TypeError。崩溃点在**构造回执那一行** —— 宿主其实已经恢复成功、工作区记账也补回来了，用户看到的却是一句失败，而且列表不刷新，得手动刷一下才发现它好了。现在回执由门面按权威归档集合自造，op 层不再读注册表的返回值。
- **导出的正文里混着思考**：取文本那一步只判「这个对象有没有 text 字段」，而思考块 `{type:'reasoning', text}` 恰好符合，于是思考一直和正文拼在一起导出去。现在按块类型取文本 —— 同一条缺陷 0.16.x 已在子智能体侧修过，导出侧是它的第二个出口。
  - 副作用要说清：**同一份会话在 0.18.5 前后的导出产物对不上**，少掉的那段就是当初混进来的思考。
  - 因此「只有思考、没有正文」的助手轮次在简洁档会第一次变成导不出来，跳过原因里会写明是档位问题、不是内容丢了。

### 变更

- **导入弹窗那一格改叫「工作区」**（原来叫「项目目录」），与导出弹窗的筛选同名同义；文件要求那一行跟着改口。
- **恢复回执不再带 `archivedSessionIds`**：界面只用 `ok` / `error` / `workspace`，而归档集合可能有几千条，每次单点恢复都全量回传一遍没有意义。

---

## [0.18.0] - 2026-10-01

斜杠命令「工具」段 + 快捷提示词（含场景绑定）+ 兼容页两段开关与挂载实况。

### 新增

- **斜杠命令「工具」段**：对话输入框打 `/` 就能进场景、启停技能 / MCP 服务器 / 子智能体 / 提示词 / 记忆，点完菜单不关、接着点下一条。走宿主官方 `inputTriggers` 通道（不改官方包），只放可逆动作。
  - 六个域各一行，点一行原地进入该域条目（面包屑「工具 › 技能」）；启用项绿色对勾、停用项空心框，右侧灰字是条目自己的备注，域行右侧是当前态摘要。
  - 条目按域内唯一的 `key` 定位（技能与 MCP 服务器会重名）；点下去先叠本地乐观状态，写成功后按官方口让菜单重取一次候选。
  - 每个外部技能目录多一行「目录名 · 目录」，开得也关得；列表全量给出不截断，技能按来源目录、记忆按场景分组，已启用的在前。
  - 场景域不列两个恒开的保留场景；记忆域默认带上「全局」那一组并钉在最前面。
  - 半截 token 直接按 Enter 会被拦下，不会当普通消息发给模型。
- **快捷提示词**：提示词页拆成「全局提示词」与「快捷提示词」两段。快捷词不注入上下文，在 `/` 的「快捷提示词」段点一下把正文原样贴进输入框（不自动发送）；与预设两份存储（`hub/quick-prompts/`），每条一颗开关管它在不在 `/` 里。
  - 新 op 8 条（list / create / update / toggle / remove + 回收站三条）逐条登记进 `op-registry`，写侧与五个管理域同一条门禁。
  - 数据纪律与预设同级：删除进回收站、可勾选导出成 zip、随整机迁移快照走。
- **场景可以绑定一组快捷提示词**：「修改场景」里那颗下拉默认「当前启用的」= 不绑、进出不碰；勾了的进场景启用、其余停用，退出按快照还原。空表是合法值（= 进入后全部停用）。
- **兼容页「斜杠命令入口」一组**：两段各一颗勾选框（新 op `slash-settings`）+ 一枚「已生效 / 未生效」标签（挂载实况由客户端按段上报）；功能总览同步多一行。
- **一条全局轻提示 `showPluginToast`**（右下角）：斜杠命令是在对话页按下的，`Notice` 长在页签里、那时设置页根本没挂载。

### 修复

- **`scene_manager_switch` 退出场景的回执说「什么都没改」**：判据把"目标就是当前场景"的早退与"真的退掉一个场景"混成同一个形状，模型每次退出拿到的都是 `OK: already in scene「」`。
- **`/` 菜单进 / 出场景不应用、也不恢复档案**：「启用集合与当前模式恒等」这条原本靠每个调用方各调两个 op 维持，`/` 那一行只调了一个。现在收到服务端兜住，面板 / `/` / 模型工具都只发一次调用。
- **分组卡片点标题收不起来**（MCP 页 0.11.0 起、提示词页两处）：写进"收起 = true"那张表里的值取反错了，每次点击都把同一个值写回去。

### 变更

- **档案摘要与切换回执补上「模型工具表」这一档**：`scene_manager_list` 多一格「工具表方案「X」」，切换回执多一句「切到方案「X」（关 N 条）」/「按进场景前的快照还原」；名单本来没变就一句都不说。模型侧不提快捷提示词。
- **`/` 的「工具 › 提示词」域里两类提示词都是启停行**，贴文字改由「快捷提示词」那一段常驻承担（两个源、两件事）。
- **提示词页两组换成技能那样的可折叠卡片**（卡片头 = 组名 + 条数）；快捷那组卡片头给「全选 / 取消全选」，全局那组不给（单选）。
- **全局提示词的「应用 / 重新应用」两颗文字按钮换成一颗药丸开关**（在「编辑」左边）：亮着的再点一次 = 重新写回 `AGENTS.md`。
- **「修改场景」弹窗分两模块**（基本信息 / 场景绑定），快捷提示词的勾选清单换成段卡片（段头计数 + 全选，段体按内容长）。
- **模型工具表里「提示词」这一组改口「全局提示词」**，两条工具的说明点明只管写进 `AGENTS.md` 的基线；没有为快捷提示词新增模型工具。
- **含下拉与勾选清单的字段外层 `label` 改 `div`**：嵌套 label 会把"点段头空白"转给勾选清单里第一颗复选框。
- **场景档案弹窗的段脚注撤了**（同一件事在段头计数、未定义提示与脚注各说一遍）。
- **「新增提示词」弹窗删掉「或从现有预设复制」那一格**（`agentsmd-create` 的 `from` 参数保留，只是界面不再给入口）。

---

## [0.17.0] - 2026-09-30

对抗性审查收尾：三批（P0/P1/P2 表 19 条 + §5 脆弱性地图 F1–F12）与随后一轮复审（14 条发现 + 2 条替代项）全部处理完毕，逐条到终态；P0 / P1 每条都先复现坏行为再修。报告与终态处置表在 `review/`（本地工作稿，按 `.gitignore` 不入版本库）。

### 修复

- **记忆索引：一次读失败不再等于「整份配置被清空」**（P0-1）：读失败（EACCES / EBUSY）曾被当成「没有索引」，随后任何一次写都会把空索引落盘，界面 5 秒轮询的读操作也会触发。现在只有 ENOENT 算新用户，其余读失败一律按「不可信」处理（拒写 + 界面按全部未启用显示）。
- **场景回收站：含子目录 / bundle 记忆的场景恢复不再必然失败**（P0-2）：负载名拒收带 `/` 的名字，而场景记忆天生是目录树 —— 删除能成功、恢复必失败且不可再恢复；删除回滚失败还会把回收站条目整条删掉。现在负载名支持安全相对路径，恢复失败退回回收站，回滚没做完绝不清理条目。
- **记忆回收站恢复不再能写到记忆根之外**（P0-3）：条目里的组名是磁盘数据，`../..` 能把正文写到记忆根外。现在与回收站列表同一道判据，并在落盘前核对落点是否在根内。
- **整机迁移快照不再导出明文凭据**（P0-4）：默认导出只认 `key` / `token` / `secret` / `password` 四个参数名，`?api_key=` / `?access_token=` / `?sig=` 等全部漏掉。现在与 MCP 列表同一套打码，并补上非绝对地址的兜底；`$VAR` / `!!js` 这类间接引用改回原样保留。
- **MCP 体检不再回未打码的地址**（P0-5）：它是免令牌的只读操作，却把配置里的 URL 原文回给客户端。现在地址一律打码后回（主机与路径保留），命令名仍明文（与 `mcpm-list` 口径一致）。
- **注入取数失败不再伪装成「已清空」**（P1-8 / F2）：某个域抛异常时被当成「这轮没内容」，还向模型发一条假的「已清空」，界面显示成「未投递」。现在异常与真的空分开：抛异常的域这轮不发，「注入实况」新增「取数失败」状态，兼容页那一行同时承载装配失败与运行期失败。
- **读失败不再改名用户文件**（本版自查）：上一批把读失败也接到「改名留存」那条处置上，而读失败常是瞬时的 —— 等于把「重试即可恢复」升级成「记忆全没了」。现在两条路分开：解析失败照旧改名留存，读失败只标记不可信、不动文件，下次读成功自动解除。
- **场景改名 / 删除→恢复不再丢记忆的索引条目**（P1-1）：改名没搬每条记忆的启停 / 排序 / 标签 / 置顶 / 备注，这些条目被当悬空引用清掉 —— 用户显式停用的记忆会自己重新启用。现在改名按前缀整体迁移，删除时一并收进回收站、恢复时合并回来。
- **删除 / 恢复场景不再跟随目录链接搬走根外文件**（P1-2，已实测复现）：`memories/<场景>` 若是指向根外的链接，列目录会列出链接目标的内容，删除会真的把根外文件搬进回收站。现在动手前核对落点是否在根内，遍历时跳过链接。
- **MCP 导出不再谎报「hub 目录写入失败」**（P1-3）：它把一份 JSON 交给了只接受补丁格式的写入器，校验必然失败且错误被吞，界面给的诊断是错的。改用普通 JSON 写入。
- **停用的 MCP 工具不再能被调用**（P1-4）：`mcp__<server>__<tool>` 对 `__` 有歧义，而守卫取第一个 `__`、列表取最后一个、场景档案又取第一个 —— serverName 含下划线时守卫查表不命中即放行，这是**执行侧**失效。现在三处共用同一个切分函数 `splitMcpToolName`。
- **重复 loader id 守卫不再只扫 MCP 行**（P1-5）：导入一条非 MCP 条目就能撞出重复 id，而同 id 会让插件组装失败、DSH 起不来。现在扫全部 insert 子条目（顶层覆盖块不算）。
- **整机迁移的技能域从「永远不工作」到能用**（P1-6）：导出侧读错返回结构，技能永远导出 0 项而界面显示「迁移完成」；导入侧又把 zip 喂给只认目录和 `.md` 的入口。现在导出按正确结构展开，导入改走能吃 zip 的链路。
- **`history-delete` 收敛到「只能删已归档会话」**（P1-7）：批量删除一直求交归档集合，单删却直接删 —— 一个客户端 bug 就能永久删除任意已保存会话。现在单删也先确认在归档集合里（查不到归档状态即拒绝）。
- **场景绑定的预设正文有了与 AGENTS.md 相同的注入预算**（P2-1）：AGENTS.md 分支有 64 KiB 截断，场景分支一点上限都没有。现在复用同一套截断与提示。
- **全局 AGENTS.md 与场景基线快照改为原子写**（P2-2 / P2-16）：AGENTS.md 是宿主每步都重读的文件，中断可能留下半截内容进模型上下文；基线快照损坏会让「退出场景恢复 AGENTS.md」静默失效。现在两者原子替换，快照读不出来时如实报警。
- **编辑 / 删除 MCP 不再删掉手写 `config` 的覆盖块**（P2-6）：补丁按条目 id 生效，手写配置是合法用法，删除时却被整块带走。现在只删纯块；「启停值读不出来」（如 `!!js …`）也不再被当成显式启用。
- **去重读的不再是「另一个文件」**（P2-19）：全局指令路径有两条来源，去重时用了不是宿主实际读的那一份，同一份预设正文被注入两遍。现在由调用方把宿主实际读的那一份喂进来。
- **保存场景档案不再抹掉别的场景**（P2-3）：档案切片在写队列外读、队列内写，窗口里另一个写者的改动会被陈旧整片回写覆盖。现在每次写显式声明改哪几片，档案另走逐场景增量。
- **场景名口径统一：命名用单段、定位用完整路径**（P2-4）：多段名（`a/b`）能通过校验并被写进启用集合，但注入时两边对不上，表现为「开关点了、场景没生效」且零报错。现在命名路径必须单段（多段当场报错），定位路径按完整路径寻址。
- **备份名加上毫秒与进程内序号**（P2-5）：时间戳只到秒，同一次操作连写两遍时后一份覆盖前一份，「保留 5 份」实际变成「保留 5 个秒」。两代格式都认，存量备份仍会被清理。
- **行级编辑不再改坏块标量**（P2-7）：折叠空行会把 3+ 连续换行折成 1 个，而块标量（`!!js |`）的内容就是换行与缩进 —— 折一次等于改写用户手写的表达式。现在跳过块标量内部，认不出形状时退化为旧行为。
- **`tools.restrict` 缺失时不再静默**（P2-8）：全局 tools 面没有 `restrict` 时直接返回，停用工具仍留在模型可见的工具表里，兼容页还报「ok」。现在与另一处同 id、同文案地上报。
- **整机迁移导入不再吞掉各域的「需要注意」**（P2-9）：只取成功 / 跳过数，于是「这些密钥已是打码占位符，请重新填写」到不了界面。现在透传并渲染（记忆域带上跳过原因，上限 5 条）。
- **`mcpmRestart` 不再把服务器留在停用态**（P2-11）：某些形状下（条目自带 `disabled: true`、靠覆盖块启用）恢复步骤会把生效值回落到条目自带值。现在恢复前比对一次，不等就显式写回。
- **令牌操作不再把「覆盖条目」当成「第二份补丁」**（P2-12）：判据只对 insert 条目成立，而 0.1.7 bundle 挂载下令牌的写点就是覆盖条目 —— 那种安装下所有令牌操作被全量拒绝。现在按形状分类，写点优先取覆盖条目。
- **不可解析的超时值不再写成 `NaN`**（P2-13）：手写补丁里 `toolCallTimeoutMs` 被读成字符串，`Number("30s")` 直接把 `NaN` 落盘。现在认不出来就整行不写，`0` 也不写。
- **「已知工具」侧车的读-改-写整段进写锁**（P2-15）：两个并发写者各读旧表、各并进自己那台服务器，后写的整份覆盖先写的。现在锁内读 → 合并 → 落盘。
- **技能上传不再能从暂存目录逃出去**（P2-17）：路径校验只挡「正好是 `..`」的段，而 Windows 会裁掉段尾的空格，`.. ` 等于 `..`。现在按段判「会不会被文件系统改写」，正常点文件（`.DS_Store`）照常放行。
- **子智能体列表不再列出管不动的隐藏人设**（P2-18）：隐藏名（`.foo`）被判 hidden，列表里却出现一个「看得见、改不了、删不掉」的人设。现在列表侧与校验侧同一道谓词。

### 修复（复审）

- **`skill-trash-delete` 的路径穿越堵住**（F1，P0）：`id` 直接拼进回收站目录路径，`id=".."` 就能把整个 `hub/trash` 交给系统回收站。现在走既有的单段名校验。
- **「读改写例外」不再被借道**（F2，P1）：`tool-table` 免令牌的依据是「纯读」，而「保存方案 / 删除方案」走同一个操作名却会写侧车。现在写条件改为数据化声明：带写触发键就必须过令牌。
- **场景锁定对模型面生效**（F3，P1）：冻结只包在界面那条入口上，锁着一个非活动场景时模型仍能改技能 / 记忆 / MCP / 子智能体 / 场景档案。现在两侧同一份判据；「锁着仍能解锁、仍能退出场景」用契约测试钉住。
- **打码 URL 不再被写回补丁**（F4，P1）：新增 / 导入 MCP 拿到的是已打码的地址，写回时不做还原，`%3Credacted%3E` 真的落进补丁。现在所有写路径强制还原，还原不出来就报错要求重填。
- **打码链补上 userinfo 与 fragment**（F5，P1）：`https://user:pass@host/…` 与 `…#access_token=abc` 原样输出，而这两种形态在托管服务里都常见。现在一并打码。
- **块标量识别按 YAML 规范补全**（F6，P1）：识别只认 `|` / `>` 紧跟指示符的形态，`!!js |` / `&a |` / `|2-` 都不算，照样被折 = 改写手写表达式。现在按规范最小集补齐，另加「认不出的疑似块标量头 → 整份文件不折叠」。
- **注入通道的「取数失败」覆盖到域内部**（F7，P1）：上一轮只堵住通道拿到异常那一层，而某个域自己就把 IO 错误吞成空串。现在域内部也把 IO 失败与真的空分开；文件不存在仍按正常空处理。
- **「首选」对模型真正生效**（F8，P1）：界面与模型侧共用同一个分组函数，而 provider 那条路径没传 `preferred` —— 同名首选只影响界面显示。现在 provider 路径传上；首选来源处于停用时如实回报「已记录，但它不会生效」。
- **单删的归档判据取权威集合**（F9，P2）：单删用有损投影（头部读不出来的会话被静默跳过），批量路径用权威集合 —— 同一份数据两条路结论相反。现在单删也取权威集合。
- **「只能删已归档」成为不变量**（F10，P2）：级联删除按父子关系直接删、不问归档集合，删一个已归档父会话会连带删掉未归档的子会话。现在只吃已归档的子会话，读不出归档状态时什么都不级联。
- **记忆回收站恢复失败会回滚**（F11，P2）：复制中途失败留下「半放回 + 目标已非空」，而条目还在 —— 下一次恢复撞「同名记忆已存在」，这条记忆再也恢复不了。现在失败时清掉落点并保留条目，可直接重试。
- **`.txt` 按内容嗅探，不再一律当纯文本**（F12，P2）：改名成 `.txt` 的 JSONL / Markdown 转写会被整份折成一条 user 消息，而返回的是「导入成功」。现在先嗅探，认不出且行数不少时如实提示。
- **引用探测失败不再放行删除**（F13，P2）：`refs()` 返回 `null` 时放行 —— 删掉被场景绑定的预设会静默让场景驱动失效。现在探测失败一律拒绝，并说明是「探测失败」而非「有引用」。
- **场景基线写失败不再被吞**（F14，P2）：失败只写一行 `warn`，AGENTS.md 照旧切进场景态而没有退路，界面零提示。现在返回失败原因，与「AGENTS.md 未写入」分开上报。

### 新增

- **兼容探测表新增 `fs.patch-io`**（F5）：补丁文件的读写要经 `ctx.fs` 升级沙箱策略，五个方法任一改名会让 19 处补丁写路径一起报错。现在钉在兼容页上；「参数语义变了」探不到，如实分开。
- **挂载心跳带上宿主进程身份**（F1）：额外记 `pid` 与 `hostStartedAt`，`check:host` 据此直接给结论（写心跳的进程还在 → 这一轮确实挂上了；已不在 → 宿主重启过）。局限：进程号会被复用。
- **doctor 新增 `AGENTS.md` 增量刷新的 drift canary**（F3）：官方改成事件驱动 / 改 digest 口径时旧正文会继续注入且零报错。现在加一组源码标记检查，缺失时直说影响面。
- **`hostRootCandidates()` 成为「宿主在哪」的唯一口径**（F10）：运行时、doctor、host-deps 此前各写一份，doctor 还少了桌面版归档那条（桌面宿主上会报「找不到宿主」或比出假的「两份不同拷贝」）。现在三处共用一份。
- **`mcpmListView` 上报 MCP 工具前缀的漂移**（F6）：前缀抽成 `MCP_TOOL_PREFIX`（唯一一处）并加一条 inform-only 上报。判据是「`mcp` 词根后换了分隔符」且至少两个同名根的工具 —— 第一版没排除本插件自己的 `mcp_manager_*`，会让这条在每台机器上误报，已自查改掉。
- **服务器名的 `__` 歧义会出声了**（N2）：`serverName` 允许含 `__`，于是「`a` 的 `b__c`」与「`a__b` 的 `c`」在全名上同形。本轮不收紧校验，改为加一条 inform-only 上报，两种形状取更具体的那条只出一行；判据是纯函数且零误报，只上报、不阻断、不自动改名。

### 变更

- **两份 peer range 不再漂移，且明确「不设上界」**（F9 / §5.4）：`probe.ts` 与 `package.json` 此前是两个写法（且前者 caret 隐含上界，与注释自相矛盾）。现在两处是同一个字符串并由契约测试钉住；无法用 range 消除的缺口（尚未枚举的新 rc 在 npm7+ 下仍会 ERESOLVE）写进注释。
- **契约测试共补 34 条不变量**（`test/contracts.test.mjs`，三批 18 条 + 复审 16 条）：全部钉纯函数不变量与宿主契约，不加界面测试。

### 说明

- **实测**：`npm run build`、`npm run check:i18n`（zh/en 各 1501 键）、`npm run typecheck:client`、`npm run lint` 通过；`node --test test/contracts.test.mjs` **67/67**（33 既有 + 34 新增）、`test/client-exports.test.mjs` 1/1；`doctor.mjs` / `host-deps.mjs` 正常跑完。
- **先复现再下结论**：复审 14 + 2 条每条都先复现坏行为，修完再把修复回退掉重跑同一份探针 —— 只证明「改完是绿的」不足以说明探针在判别。回退后转红数：F9 / F10 5 项、F11–F14 10 项、N1 7 项、N2 2 项。
- **N1 在本机是 no-op（如实标注）**：本机 7 个已配置 serverName、105 条已知工具，无一含 `__`，停用表为空 —— 三种切法逐条比对 0 条不一致，这次统一切法是为将来修的。**残余风险**：两个真实服务器名互为 `__` 前缀时，守卫（候选必须窄，否则 fail-open）与显示侧仍可能给出不同答案，由 N2 的上报把它变成可见提示。
- **未做的验证**：按 `AGENTS.md`，功能验证由用户在真实环境完成 —— 本次未在真实宿主里点过界面。三处只做了静态核对：`mcpmListView` 的前缀漂移上报、`webServer.register` 失败的运行期上报、备份名的新格式。
- **本版仍未处理的部分**：两份报告里没有了。两处明确不做、记录在案：① §5.4 余下两条属持续维护成本（每出一个宿主 rc 需手工同步 5 处、桌面宿主缺「布局漂移」上报），记在适配矩阵里；② **F15 不收紧**（拒绝含 `__` 的 `serverName`）—— 今天放行 `__` 的 5 处校验一旦收紧，存量服务器会从「能管」变成「管不了」，改由 N1 + N2 处理。

## [0.16.6] - 2026-09-30

官方内置技能管理补全 web 侧：web 宿主照注的沙盒诊断技能接入技能页（可见、可停），Office 三件套按裁定在 web 上一并暴露；并补齐接管后缺失的 LibreOffice Kit 路径段。

### 修复

- **web 宿主注入的沙盒诊断技能现在看得见、关得掉了**（0.16.5 的误判）：0.16.5 按「web 不注入官方技能」把 web 整个挡在官方内置管理之外，但官方宿主的沙盒技能门控是 `process.platform === "win32"`（`dsh-sandbox-local` 源码核对）——只看操作系统，web 照样向每个会话注入 diagnose-windows-sandbox-acl，于是 web 上「页面不显示、会话照注入」。现在 web 也物化官方技能并以 rank 599 接管：来源出现在技能页，停用即不注入。
- **接管后缺「Installed LibreOffice Kit」段**（0.16.5 桌面上已存在）：官方 provider 在返回 office 技能正文时追加一段 LibreOffice Kit 的 node/cli 绝对路径，SKILL.md 明文要求使用这段路径、且禁止自行搜索；以 rank 599 接管后官方 provider 不再被问到，这段就丢了 —— office 技能里的 LibreOffice 渲染/转换命令实际没有可用路径。现在由插件按官方 `officeRuntime()` 契约逐字复刻补上：桌面 node 取宿主自带的独立 node（`<resources>/runtime/primary-runtime/dependencies/node/bin/`，官方明令 packaged 应用必须独立 node，electron 本体不行；`DSH_PRIMARY_RUNTIME` / `DSH_BUNDLED_PRIMARY_RUNTIME` 环境变量优先，SDK 部署照官方取值），cli 取 `app.asar.unpacked` 里的真实文件（独立 node 读不了 asar 内部）；web node 即宿主 node 进程（官方默认 `process.execPath`），cli 走宿主进程解析链。任一路径不是真实文件时改用官方口径的「LibreOffice Kit is disabled in this deployment」降级文案 —— 绝不给跑不起来的路径。

### 变更

- **官方内置技能按宿主形态各物化一份**：物化目录从各宿主共用 `$DSH_HOME/tool-management/official-skills/` 改为 `official-skills/<desktop|web>/` 各写各的 —— 0.16.5 靠「web 完全不参与」压住竞态（web 重建会把桌面物化好的 4 个清成它解析到的 1 个，实测），分形态目录让 web 也能参与管理而不互踩；0.16.5 共享布局的顶层残留按已知名单自动清理。启停状态按技能名记在来源 `official` 下，两种形态共用一份。
- **web 技能页也暴露 Office 三件套**（用户裁定）：web 宿主不装配 office 插件、不注入，但 npm 包自带完整 assets —— web 上从宿主进程解析链物化后照常列出、可启停（启用后随技能目录注入会话）。

### 说明

- **实测**：官方源码逐处核对（沙盒技能门控 `dsh-sandbox-local` 只看 win32；office 插件仅桌面装配；`officeRuntime()` 契约与桌面装配的 node/cli 落点），本机桌面安装核实独立 node 与 unpacked cli 真实存在。合成夹具四模式全过：web（4 个技能物化，Kit 段 node=宿主进程、cli=解析链包内 cli）、web 无 libreoffice-kit（官方降级文案）、桌面（Kit 段 node=primary-runtime 独立 node、cli=app.asar.unpacked 真实文件）、桌面目录布局不同（office/沙盒全走解析链兜底物化，Kit 降级文案，正文不含指向不存在布局的路径）。

## [0.16.5] - 2026-09-30

issue #1 收尾与桌面版第二轮适配：兼容页身份比对改为逐包解析、逐包核对（桌面版不再误报「两份不同拷贝」），「全部可用」与「N 项不可用」不再同屏；桌面版注入会话的 4 个官方内置技能接入技能页管理。

### 修复

- **桌面版兼容页误报 5 条「两份不同拷贝」**：宿主侧的身份比对把「realpath 机制整轮不变」错写成了连**解析结果**一起复用 —— 第一个包（cordis）的宿主侧入口路径被当成其余五个包的宿主侧路径，五条全部比成「与 cordis 不同」→ 5 条假阻塞项，banner「能力 18/18 · 全部可用」与红卡「5 项不可用」同屏（桌面版 0.2.0-rc.2 实测全中）。现在逐包解析、逐包取真实形态 —— 解析本就便宜，Node 自身还有缓存；同日新旧对比实测：旧代码 1 真 / 5 假 + 5 条阻塞，修复后 6 真 / 0 阻塞。
- **安装形态下的修复指引不再是跑不了的命令**（issue #1 次要问题 1）：阻塞项原文让人去跑 `node scripts/host-deps.mjs --fix`，而 `package.json` 的 `files` 不含 `scripts/`（开发者脚本本就不该随发布走），npm 装出来的用户照做只会拿到 `MODULE_NOT_FOUND` —— 指引指了一条不存在的路。现在按**实际形态**给：源码检出（插件旁边就有 `scripts/host-deps.mjs`）保留原文，并点明要「在插件源码目录」跑；npm 安装形态改说「升级或重装本插件后仍然如此再报」。兼容页底部那句「可运行 node scripts/doctor.mjs 查看」同理分两键，安装形态下不再指命令。
- **路径取不到真实形态时不再编一个「两份拷贝」的结论**（issue #1 次要问题 2）：`realPathOf()` 以前 `catch { return value }`，把「这条路径不可解析」静默降级成「拿输入去比较」—— 于是路径/权限问题看起来就是「插件与宿主加载的是两份不同拷贝」，用户照着它去修只会白费功夫。现在取不到真实形态就**如实记原因**（`error.code` 与消息原文），这类包给 `sameAsHost = null`（比不了）并单独出一条说明，带包名、哪一侧（`host` / `plugin`）、解析到的路径与失败原因；界面显示「无法比较（路径取不到真实形态）」并列出两侧。
- **兼容页不再一边「全部可用」一边挂着红卡**：能力注脚与红卡高亮此前把「身份待处理」（两份拷贝这类 —— 不影响能力可用性）混进了能力降级计数。现在两处只看能力降级数；汇总行三分：全可用 / 能力降级 / 身份待处理（新增词典键 `compat.summary.identity`），各说各的。

### 新增

- **官方内置技能接入管理**：桌面版宿主向每个会话注入 4 个官方内置技能（office-docx / office-pptx / office-xlsx / diagnose-windows-sandbox-acl），此前技能页看不见、也关不掉。现在它们以单一「官方内置」来源出现在技能页，紧跟 DSH 技能之后：每次宿主启动从官方源头整目录**物化**成插件自有的一份真实目录（`$DSH_HOME/tool-management/official-skills/`；office 取自桌面运行时目录 `<resources>/runtime/office-skills`，沙盒诊断取自官方 asar 包内资源 —— 官方自己的副本一个在 asar 里、一个由官方 provider 复制进临时目录自管，直接指着读既不稳，也没法让 PowerShell / Python 子进程执行脚本），扫描、启停、脚本执行全部落在真实文件上；单个技能可启停（overlay 以 rank 599 压过官方 provider 的 600），来源层与默认来源同语义（不可移除、无来源开关、源文件只读）。web 宿主不注入任何官方内置技能，这个来源**不出现** —— 物化目录虽与各宿主共用，非桌面宿主绝不进来重建（web 宿主进程里的官方模块拦截器能把 `@deepseek-ai` 裸名解析到宿主副本，若也重建会把桌面物化好的整目录清成它解析到的那几个；2026-09-30 实测两份 UI 同时只剩沙盒 1 个）。预设参考技能（dsh-agent-preset/skills）不注入会话上下文，不列（用户裁定）。

### 变更

- **源码检出与 npm 安装形态的行为差异，只在指引上一处**：`/dsh-plugin-tool-management` 里有没有 `scripts/host-deps.mjs` 决定给哪句指引（本插件不从 `scripts/` 加载任何东西），其余判定完全一致。

### 说明

- **收尾范围**：issue #1 的主因（`import.meta.resolve` 的 URL 未解码，含空格路径必现；macOS 上开头斜杠被一起删掉）已在 0.16.0 随 `fileURLToPath` 修掉，本版带次要两条的收尾、身份比对的逐包核对与官方内置技能管理。
- **实测**：源码检出与安装形态两种位置的 `isSourceInstall()` 分别得 `true` / `false`；注入一个「能解析、realpath 必失败」的目标跑真实代码，产出 `kind:"realpath"`、`side:"plugin"`、原因的 `ENOENT` 原文，且**不再出现在阻塞项里**；悬空 junction 的语义实测为 `existsSync=false`、`import.meta.resolve` → `ERR_MODULE_NOT_FOUND`（因此走「宿主锚点里找不到它」的 `unverified`，同样不会误报成两份拷贝）。官方内置技能按双模式离线验证：web（无 `process.resourcesPath`）不出现该来源且不触碰共享物化目录，桌面物化 4 个技能、来源紧跟 DSH 技能、office 的共享 `scripts/` 相对结构保留。

## [0.16.0] - 2026-09-29

### 修复

- **桌面版被误判成「两份不同拷贝」**：桌面版 DSH 把整套官方包封在 `resources/app.asar` 里，插件在归档外的 profile 目录，两边物理上不可能是同一份文件 —— 兼容页却把它算成 6 条阻塞项，还让用户去跑 `node scripts/host-deps.mjs --fix`；那条命令在这台机器上只会把插件依赖 junction 到 npx 缓存里的另一个宿主（实测：0.2.0-rc.2 → 0.1.7-rc.2）。现在宿主发现先认归档（`process.resourcesPath` 下确实躺着 `app.asar/dsh` 才算），归档宿主与插件**按版本**核对：版本一致就记一条说明（「同版本、仅打包方式不同」）并从阻塞项里摘出去，版本真不一致才照旧报阻塞（2026-09-29 桌面版 0.2.0-rc.2 实测）。
- **宿主版本显示 `unknown`、带空格的安装路径上身份比对必然失败**：`import.meta.resolve` 给的是 URL，插件把 `%20` 当成普通字符留在路径里 —— 「D:\DeepSeek Harness\...」这种路径于是永远打不开，版本读不出来，比对也就必然不等。改用 `fileURLToPath` 解码（0.1.5 起这条路就有，只是此前没人在带空格的路径上装过）。
- **MCP 体检补上端点探测**：此前只查配置格式，一条编造的 streamable-http 地址也能拿绿点（2026-09-29 GUI 测试发现）。现在格式对了就对配置地址 GET 一次 —— 带配置的鉴权头、5 秒超时、不读响应体，与宿主连接该服务走的是同一地址同一头部；连不上点黄，说明里带原因（域名解析失败 / 连接被拒 / 超时 / 证书校验失败）。逐行检查同时改成并行，「全部检查」不再被挂掉的服务按行数排队拖慢。
- **删除 MCP 服务同步清掉引用**：只删补丁行的话，引用它的地方全成死键 —— 场景档案的勾选与备注、停用表、「已知工具」缓存、服务器备注现在一并摘掉；被**锁定**的场景档案是用户显式冻结的，跳过不动并在回执里说明。删除后等宿主 loader 摘条目（最多 5 秒），等不到就明说「列表可能短暂残留它的行，宿主收敛后自动消失」—— 此前那条 `include:*` 残留行无声出现、约一分钟后自己消失，用户只会以为没删干净（2026-09-29 GUI 测试发现）。
- **MCP 页轮询不再空转重渲染**：本页每 5 秒轮询一次，此前即使带回的数据一模一样也整页换一批新对象 —— 缓存计算、React 协调、开着的弹窗全部跟着空转，点击与输入都可能被这阵重渲染打断。现在内容没变就跳过整页更新（2026-09-29 GUI 测试发现）。

### 变更

- **「插件适配版本」改标 0.2.0-rc.2**：桌面版首发版本已实测通过（宿主版本读得出来、18 项能力全通过、归档宿主的身份判定见下条），`VERIFIED_HOST_VERSION` 与 `EXPECTED_PEER_RANGE` 一起加上它 —— 宿主比自己验证过的版本新时，那条「实际宿主与验证过的版本不同」的提示就不再无谓地刷在桌面上（web 宿主 0.1.7-rc.2 会开始提示，这是事实，不是故障）。
- **兼容页的三张指标卡只在有事要说时带注脚**：「宿主版本」下面那行「最低要求 ≥ 0.1.5-rc.2」删掉（那是**安装期**的 peer 下界，摆在这里会被读成对当前宿主的断言）、「插件适配版本」下面那行「本插件按此版本验证」删掉（同一件事说两遍）、「可用能力」全通过时不再写「全部通过」（分子分母已经说了）—— 降级与「缺口由插件自补」两种仍照旧说清楚（2026-09-29 用户裁定）。该 peer 下界仍留在 `compat-status` 的载荷里（doctor 与外部脚本可读），只是不再显示；配套的界面词典键 `compat.peer`、`compat.verified.note`、`compat.caps.all` 一并删掉。
- **四个域的行状态统一成名字后面的描边胶囊**：MCP「已运行 / 未运行」改「已启用 / 未启用」、技能与子智能体「已停用」改「未启用」、记忆「本条已停用」改「未启用」（「场景未启用」措辞不动）。配色按语义分工：绿=生效中、灰=没生效但不是故障、橙=当前没可用工具 / 诊断异常、红=启动失败 —— 停用类不再是橙色。
- **MCP 的体检状态点挪到名字前面**：以前它在标签列里，读一行要先穿过名字才找得到那颗点。点占的 14px 单独成槽，名字、备注与表头一起对齐到槽的右侧（2026-09-29 用户反馈名字比下面的备注右移、没对齐）。
- **子智能体启用时也挂「已启用」胶囊**：以前只有停用的那颗，"没有标签"是不是等于启用得猜。
- **MCP / 技能 / 记忆三页取消「状态」列**：状态跟着名字走之后那一列空了，表头少一项，行网格从四列收到三列。
- **MCP 行固定两行预算**：标签（工具数 / 层级 / 重名）从独立的标签列并进备注那一行 —— 带不带备注的行高一致（此前带备注的要高出约一档），行网格再收到两列、表头只剩「服务名称与地址」。技能与记忆仍是三列。
- **窄档（面板 <780px）的 MCP 行高 81px → 69px**：58px 的行下限是三行时代留下的，动作组又仍跨着两个空行、白付两格行距；两处都按两行内容重算（上下各 11px 内边距不变）。
- **MCP 行去掉「重启」按钮**：重启就是那枚开关的关→开，用户自己拨即可。只有它用的「重启中… N 秒」横幅（连同那枚每秒重渲染的计时组件）一并删除，三处「点「重启」重试」的提示改说「把开关关掉再打开重试」。行右侧剩 开关 / 检查 / 详情 / 编辑 / 删除；模型侧的 `mcp_manager_switch(action=restart)` 与「最近改动」里的重启记录不受影响。
- **MCP 第二行改成标签在前、备注在后**：工具数那枚短事实先读到，长备注留在行尾自己截断。
- **「最近改动」的说明句拆成两条**：「记什么」与「会不会涨」各一条，用字段说明同款的条目样式，不再是一整段；「记什么」那条去掉括号里的补语。
- **「修改场景」的提示词预设说明改成一句**：原来两条（启用即以它为全局基线 / 启用期间应用别的预设 = 改绑）压成「为当前场景设置全局提示词」。条目符号留着，「场景名」的说明也一并挂上 —— 这张表单里字段说明同款（校验报错那句仍是红字，不进清单）。

## [0.15.0] - 2026-09-28

适配 DSH 0.1.7-rc.2（升级后五处失效逐项修复），并带五件增量功能。

### 新增

- **兼容探测表补上 0.1.7 的两块契约面**：新增 `settings.document-path` 与 `preset.roster-surface`，健康行常显实际观测到的路径 / 读取方式，官方再改语义一眼见底。
- **主目录推导自检**：推导失败从静默抛错升级为具名上报，按不变量自检、恢复即收；名册兜底只在真异常时留痕，健康一律不亮黄。
- **MCP 页「导入 / 导出」**：粘贴社区 JSON 一次建齐，名字净化、传输判定、重名去向在预览里说清；导出含明文凭据警示。服务端零改动。
- **MCP 配置体检**（新 op `mcpm-inspect`，只读）：每行一枚状态点，查命令在不在 PATH、URL 写法、字段形状、服务名撞车；配置一改旧结果作废。
- **「最近改动」流水**（新 op `audit-list`）：谁、什么时候、动了哪条，三方来源各标各的；只记对象名、参数一律不取，同秒同来源合并展示。
- **场景可绑模型工具表方案**：进场景把关停名单整体换成方案那份，退出按快照还原；绑定入口在「修改场景」表单，改启用中场景立即生效。
- **整机迁移快照**（新 op `snapshot-export` / `snapshot-preview` / `snapshot-import`）：一个目录带走全部域，MCP 默认打码；导入先预览、勾选域再执行，逐域走各自的导入口。

### 修复

- **MCP 列表与注入失效**：0.1.7 的 `settings.prepareDocument()` 返回语义变了，插件把 profile 目录当成主目录、读错补丁文件；现在两种形状都认。
- **预设边界整片「无法判断」+ 极简下技能 / 提示词不注入**：0.1.7 把名册 `read` 改名 `readDocument`；读取统一收敛到「`read` 优先、`readDocument` 兜底」一个出口。
- **「判断不了」改「无法判断」**（兼容页两处）。
- **访问令牌卡片的两句文案**：没令牌时不再说吓人的话；「找不到加载器行」改成按用户能做的动作说。
- **技能页误报「无法从宿主读取活动工作区」**：项目目录已删是常态而非故障，静默跳过。
- **host-deps / doctor 找不到宿主**：发现序列加上 npx 缓存扫描；doctor 对悬空老树出一条警告。
- **「设置令牌」在 0.1.7 失效**：bundle 挂载后补丁里没有 loader 行；改写进 profile 补丁的覆盖条目（官方支持的 id 定向覆写），bundle 文件永不落密钥。
- **功能总览「注入域开关」报 6/5**：分母改从 `INJECT_DOMAIN_KEYS` 取。
- **「场景锁定」的灰胶囊标签张冠李戴**：改成独立的「锁定中」。
- **会话列表标题显示成 ID 长串**：调官方投影缓存传参不符官方契约、抛错被静默吞掉，标题从没读到过；改回官方两参签名并加旧格式兜底（2026-09-28 用户反馈）。
- **功能总览在英文界面下半页中文**：句子归客户端词典、数值归服务端，对不上的回退服务端原文（2026-09-28 用户反馈）。

### 变更

- **peer 范围逐代枚举**：改为 `^0.1.5-rc.2 || ^0.1.7-rc.2`；`VERIFIED_HOST_VERSION` 升到 0.1.7-rc.2。
- **恢复归档改走 0.1.7 新增的原生 `unarchiveSession`**：运行时探测自动切到 native 路由。
- **核对 0.1.7 工作区状态新增的置顶字段**：插件全部 `setState` 均为展开式写入，置顶数据不受影响。
- **兼容页三块改成顶部按钮 + 弹窗**：「最近改动」「整机迁移」「注入实况」不再常驻长页；「最近改动」固定尺寸、只滚列表，整机迁移的目录可浏览选择。
- **改动记录可以清了**（新 op `audit-clear`）：两步确认；清空本身也留一条记录。
- **「预设注入边界」的行名改成模式名**：标准 / PTC / 极简 / 创造模式，子智能体高级选项四行同批；顺带修好一直显示原始 id 的 trust 缺省错误。
- **场景档案改 2×2 网格，四段同屏**：各段段内滚动，弹窗加大；「子智能体集」「记忆集」更名。
- **兼容页留白收一档**：块间距收紧，分组更清楚。
- **「功能总览」的琥珀只留给功能出问题**：停用类两行恒为「正常」，停用构成写进说明（整台按台、单独按个）；「模型工具表」说明收敛成一句。
- **「最近改动」的时间列恒显「月-日 时:分」**：原先当天条目只有时分，跨天分不清是哪天的。

## [0.14.0] - 2026-09-23

### 破坏性

- **模型工具改名并合并，共 20 条**：五个「新建」统一成 `_save`（有则改、无则建，回执说清走了哪条）；六个域的启停统一成 `_switch`；`mcp_manager_set_enabled` + `mcp_manager_restart` 合成 `mcp_manager_switch(server, action, level?, tool?)`。场景从记忆里分出来，自成一族三条 `_list` / `_switch` / `_save`，记忆族保持 `memory_manager_*`。**旧名不留别名** —— 别名会常驻每一轮请求，比这次省下的还多。
- **出厂默认关掉 15 条工具**：每轮实发只剩 5 条 ≈1,090 tok（整表 20 条 ≈3,769）。关的是三条 `*_save`、提示词两条、三条 `*_list`、`memory_manager_read`、场景三条与 `skill` / `memory` / `subagent` 三个 `_switch`；留着 `memory_manager_list`、`memory_manager_save`、`mcp_manager_switch`、`skill_manager_read`、`subagent_manager_run`。判据是这些信息或动作常态下由注入段与面板承担。**只在从没动过那一页时生效**，存过的选择（含"一条都不关"）照原样；「兼容」页可逐条打开，也能整批换回。

### 新增

- **模型能进入 / 退出场景**（`scene_manager_switch`）：与界面「进入场景」走同一条路径 —— 按档案整套启停 MCP / 技能 / 人设、注入收窄成该场景的记忆、把绑定的提示词写进 `AGENTS.md`（覆盖前留备份）。改的是整个运行时环境，默认要用户确认。
- **模型能查、能建场景**：`scene_manager_list` 列出每个场景的档案、绑定的预设、锁没锁、几条记忆；`scene_manager_save` 建场景 / 写档案 / 绑提示词。档案是**整段替换**，所以清单先看现状、回执再列出被挤掉的项（`mcp 4 项 → 2 项（-B、-C）`）。
- **MCP 三项能力**：改一台已配置的服务器（省略的字段保持原样，全程不碰明文凭据）、只停某个工具、顺手写备注。
- **技能两项**：整个来源目录启停（`source` 参数）；改写本插件自己写的那份（新 op `skill-update`）。
- **人设「思考强度」**：在高级选项里与「模型」并排，档位由所选模型声明。换了模型而旧档位不在新清单里会自动清掉并告知；拉取失败不动已存的值。
- **「模型工具表」能存方案**：合计行右侧「保存方案 / 恢复方案」。方案存的是关掉的名单，最多 20 份、名字不能重复（保存永不覆盖）；恢复清单第一条是不可删的**出厂默认**，自己存的可在同一弹窗里删。
- **注入按域分家**：「场景」与「记忆」各成一段，可以单独关掉记忆段而保留场景说明。⚠️ 升级后每个会话会重发一次这两段（旧消息认不出来），一次性代价。
- **提示词清单带描述**：模型能在预设之间做选择（描述上限 300 字，输入框有字数计数）。

### 变更

- **注入只写"现在是什么"**：六个板块的"什么时候该想起我"动作句、机制解释、重复的权威声明全部删掉，框架只剩标题 + 正文 + 一句"以本份为准"。四个板块合计 **823 → 643 tok/轮**。
- **注入层级定稿**：板块 `#` / 场景 `##` / 条目 `-`（此前板块标题与记忆里的场景分组平级，模型读不出主次）。
- **场景段只剩一行**：`**「代码」—— 用户描述：写代码**`；一个具体场景都没启用时整段不注入。`global` 的分组标题改成 `## 常驻信息`。
- **记忆段的授权语定稿**，整段只说一次：`以下是当前场景对应的记忆；冲突时以实际情况和用户目前的对话为准；无关勿提；以下就是全部信息：`。
- **MCP 段不再列工具数**（模型拿这个数字做不了事）；备注前缀统一成「用户提示：」。
- **关掉的工具不再被点名**：目录截断提示、"没找到 → 去调某条工具"那几句会随开关自动改写，不会把模型指向一条不存在的工具。
- **`tool-table.json` 里的旧工具名自动迁移**（读侧翻译一次并回写盘，幂等），存下的命名方案一起迁移。不认识的名字原样保留。
- **「功能总览」的「模型工具表」一行**改按"用户自己关掉的条数"判状态 —— 出厂默认不算降级。
- **`subagent_manager_run` 描述瘦身**（407 → 338 tok）：删掉与参数说明逐字重复的部分，约束一句没减。
- **子智能体高级选项折叠后的摘要固定排两行**，长名字不再被折成竖排。

### 修复

- **工具描述引用的注入板块名悬空**：记忆段拆开后板块标题改了，`memory_manager_list` 还指向旧名字，模型照着找找不到。补了一条契约测试扫描这类跨模块引用。
- **`prompt_manager_list` 报错过「生效中」**：场景接管时它按"文件内容比对"判，与界面两套答案。现在两边同源，并区分 `[active via scene]` / `[active via file]`。
- **改配置会静默清空凭据与思考强度**：`mcp_manager_save` 省略 headers/env、`subagent_manager_save` 省略 `reasoningEffort` 时会被整份重写清空 —— 现在省略即保持。
- **自定义目录里的技能"列得出、调不动"**：读取正文时不查自定义根，静默返回"没有这个技能"。
- **「采纳」统计不再把「已清空」通知当成正文**：第三列此前一直是第二列的复本。
- **记忆正文不再"逃出条目"**：正文里手写的 `#` 会渲染成与场景标题平级的大标题，现在整段包成代码块。
- **MCP / 技能族的悬停不再承诺没有的字段**：此前写着"可带 provider、模型与工具限制"，而工具签名里根本没有这些参数。
- **`prompt_manager_apply` 回执的生效时机说错了**：写「next session（当前会话不变）」，而宿主每一步都会 stat 比对并重读 `AGENTS.md` —— 实际**下一轮就生效**。三处口径（回执两条分支、`prompt_manager_list` 尾注）统一，模型不再劝用户重开会话。
- **`scene_manager_save` 的参数说明引用了已删除的授权语**：还说场景说明注入后"模型会被要求照办"，与注入定稿（场景段只陈述现状、不带指令）不符；改为如实说明去向（出现在「本机当前的场景」reminder 里），"写成指令而非备注"的写作引导保留。
- **静态描述与回执不再点名出厂默认关闭的工具**：场景族三条的互指改成中性说法（the scene listing / 「本机当前的场景」reminder），`scene_manager_save` 与 `subagent_manager_save` 回执里的 `_switch` 点名按 toolVisible 分叉（部分启用时模型会被指向一条自己没有的工具）。**新增契约测试**钉住「静态 description 不得点名出厂关闭的工具」，与板块名悬空那条同一族。
- **两条清单描述的口径对齐实际输出**：`mcp_manager_list` 不再说"注入的就是这份清单"（注入段是筛过的视图、停用服务器不进 —— 现在把这个盲区写成模型的行动依据：要查停用的用 all=true）；`skill_manager_list` 不再说用它"拿正文"（它给的是源文件路径，正文走 `skill_manager_read` 或文件读取）。

## [0.13.0] - 2026-09-23

### 新增

- **模型侧补五个工具，15 → 20**：`memory_manager_set_enabled` / `_update`、`subagent_manager_set_enabled` / `_create` / `_update`。分布此前是歪的 —— 技能与 MCP 两域模型能启停能新建，记忆与子智能体却**只读**：看得到一份记忆、看得到一个人设，开关拨不了、内容改不了，只能回一句"请到界面上点"。底层那五个 op 连门禁（写令牌 / 场景冻结 / 档案同步）都齐，缺的只是接线。提示词按裁定只留 `apply`。
- **所有会改东西的工具都写明"要用户开口或先同意"**：启停类一句 `Only when the user asks or approves.`、建与改类一句 `Only on the user's instruction.`。此前只有两个工具有这句话，其余全靠确认门兜 —— 而门是可以关掉的（设置项关掉记忆确认，或会话走「完全权限」预设），描述里这句关不掉。顺手把 20 条描述删了一遍：**工具级 6,564 → 5,608、参数级 3,052 → 2,990，合计 9,616 → 8,598**（加了 consent 句之后仍净降 1,018）。删的是重复的路径、"注入的那份与本工具的关系"这类模型一看输出就懂的交代、以及同一句 `all=true` 说明了四遍。
- **模型工具表可以关**：工具表**每一轮请求都随工具发一遍**，20 个工具的整份定义合计 ≈3,450 tok（宿主口径：整份 JSON 除 4），这一轮用不上也照付。兼容页新增「模型工具表」块，逐个工具勾选、按域全开全关，关掉的**整份不进请求** —— 只把描述写短是重编码同样的事实，这才是唯一真省钱的杠杆（实测：关掉 6 个管理类工具省 ≈1,115 tok/轮）。数字全部来自**注册时量到的整份定义体积**，界面上的 ≈ 与分组合计同一个来源，默认一个都不关。配套两处：关掉的工具在**执行侧**也拦住（可见性那半边万一没生效，名字也不该被执行），注入文本里点名它的那几句跟着换话术（技能 / 子智能体目录的截断提示与两条 `how` 行）—— 点名一个模型手里没有的工具，只会让它去猜名字。**面板不受影响**：114 个 op 与工具表互不相干，关掉 `mcp_manager_add` 之后 MCP 页照样能加服务器。
- **`skill_manager_read`**：按名字一次拿到技能正文。此前要两步（`skill_manager_list` 取路径 → 自己读那个文件），而目录只有名字没有路径、同名常几份并存，自己挑路径很容易读到被覆盖的影子副本 —— 读完以为在用这个技能，其实生效的是另一份。新工具先走 `skill-state` 的胜出者判定再读，读到的就是目录列出来的那一份。
- **「进入场景」先弹一张卡说清会改什么**：新只读 op `scene-mode-preview` 复用引擎里**已有的两个纯计划函数**（`computeMcpPlan` / `computeSkillsPlan`）与同一批现状读取，只把后面的 `apply*` 与 `saveSlice` 去掉 —— 预览与实际执行不可能各说各话。逐方向列出会启停哪些服务器 / 工具 / 技能目录 / 技能 / 人设。预览失败不拦进入：它是说明卡，不是新门禁。
- **改名留下的悬空引用有地方说了**：新只读 op `state-doctor` + 场景页黄条，把档案与绑定里指向已消失名字的行数出来。这类已经真出过两次（0.9.1 / 0.10.0），而提示词绑定那一连出口都没有 —— 宿主把"绑的预设读不到正文"当成"没绑"，界面上那条「预设不存在」标签永远不亮。只数不修：猜着改名字比留着更危险。
- **记忆页每行带出正文字节数**：记忆是唯一直接吃注入预算的域（场景段 128 KiB），页面上却看不出哪条大。读不到文件时**不带**这个字段、界面什么都不显示 —— 把"不知道"报成 `0 B` 是假话。
- **「新增 MCP 服务器」弹窗有了备注框**：随表单一起填，留空 = 侧车里不产生任何条目（不是写一条空串）。与服务器同一次写锁落盘（`id` 只有服务端算得出，重名会加后缀）；备注写失败不回滚已建好的条目，原因并进 warning。
- **五处输入加了「字数 / 总字数」**：MCP 备注两处、人设描述、技能描述、记忆描述。分母取的是**注入段的截断长度** —— 不会再出现"界面让你写 500、模型只读到 300"。存量超长的标红。
- **场景页能搜了**：其余六页早有。匹配卡片上真会显示的四样（目录名 / 显示名 / 一行描述 / 绑定的预设 id）；三格统计不跟着过滤变。
- **`/` 聚焦搜索框、Esc 清空它**：监听挂在插件自己的根节点而不是 `window`（会连宿主的键一起抢）；弹窗开着时整条放行。↑/↓/Enter 留在下一步。

### 变更

- **预览卡补两行「进入后是什么样」**：`启用 N 台 MCP：…` 与 `启用 N 条记忆：…`。上面那些行说的是"会改什么"，什么都不变时 MCP 那一段整段消失，读起来像缺了一块（用户 2026-09-23 指出）。服务器那行由引擎算（场景勾着的 ∩ 配置里存在的）；记忆那行在客户端算，判据与记忆页那一行同源（`!shadowed && enabled !== false && 场景 active`），只有一处差别：目标场景按"进入后它就是活动场景"算。公共基线与全局不必写死场景名 —— 服务端给这两者的 `active` 恒为 true。
- **预览卡的按钮改成两颗**：「先不进入」删掉 —— 它与右上角的「关闭」是同一个动作的两颗按钮；换成「不再显示」= 关掉卡片 + 以后不再弹（也不进入）。恢复的入口是场景页右上角新增的**「关闭提醒 / 开启提醒」**按钮（文字写的是**动作**：正在弹就写「关闭提醒」）。这项设置落在侧车 `scene-settings.json`，**刻意不进场景冻结** —— 它是界面提示，锁着场景的人在场景页照样该能关掉提醒。
- **预览卡里的技能只显示名字**：键是 `<来源>/<名字>`，而自定义来源的键是一串机器名（`custom-d38da02b873bdb5c/brainstorming`）—— 铺在卡上没人认得出那是哪个技能，现在只取最后一段。
- **注入实况那三个数改成只数「最近这一段对话」**：投递 / 调用 / 采纳原来是进程级累加，开着 DSH 用一下午之后「注入 8 次 · 从未调用」讲的是"今天这台机器"，而人看这块面板问的是"我眼前这一段里模型用没用"。三组计数改挂按会话身份建的账本 —— 身份本来就有（采纳判定的"正文在不在现场"早就按 agent 记），改的只是把计数也挂上去。观测面跟着一起按会话记，`调用 = 0` 该读成"真没用"还是"遥测没接上"也随之变准。
- **场景描述上限 60 → 300 字**，并删掉「最多 60 字；超出部分在卡片上省略。」：卡片那一行靠 CSS 省略号截，再长也只占一行、撑不高卡片 —— 60 卡的是"能存多少"，给的理由说的却是"显示多少"，因果对不上。
- **四个注入上限重新校准**：记忆段 256 KiB → **128 KiB**；技能 / 子智能体 / MCP 三条目录 60 → **50**；MCP 备注 200 → **300** 字。目录对齐在 50 条，横向看体积才有可比性。提示词域未动（64 KiB）。
- **五张手写门禁清单合成一份 op 登记表**：`WRITE_OPS` / `SENSITIVE_OPS` / 场景冻结 / 档案同步 / 锁定注解各自抄一份 op 名字，中间**没有任何约束** —— 这条纪律历史上失守过四次，而失守的症状从来不是报错，是"没配令牌也能写"或"锁定的场景能被改"。现在 114 个 op 每一个在 `src/op-registry.ts` 登记一条判据，五张清单由它派生；**派生结果与重构前逐条相同**（36 / 2 / 51 / 9 / 5 / 2 / 1，一条不差）。启动时再拿真实 op 表反向对账四个方向，对不上就在兼容页挂一条降级。
- **注入实况顶部多了成本一行**：「累计约 X · 最费某域 · 重发最多某域」。用"当前正文 × 该域投递次数"估，中途改过内容的话历史那几次不算现在的体积，所以带"约"。纯汇总，不动任何发送文本。
- **`memory_manager_write` 的描述写清"什么不该记"**：能从代码 / 配置 / git 重新推导的一律不写、建前先查重。execute 里做一次名字与描述的相似比对，命中就在回执后附一行 —— **只说不拦**，猜错一次就把该记的东西记不下去，比多记一条代价大。
- **`skill_manager_read` 在官方 `skill` 工具在场的会话里自动让位**：两者是同一件事（按名字给正文），标准类预设下官方那个在，第二份就是白付的 174 tok/轮。判据抄官方自己的写法（`dsh-tool-skill/lib/index.js:207` 的 `ctx.tools.get('skill', agent) === skillTool`）—— 拿 agent 当 scope 问"它解析得到吗"，比读预设组合文件更准：观察的是**这个 agent 实际能看见什么**（限定到该 scope 的同名 shadow 也算数）。判不出来时**不让位**（少一条拿正文的路，比多花 174 tok 糟）。让位是逐会话的：极简那类预设没有官方加载器（`presets/minimal/agent.cordis.yml` 里只有两个持久 shell 工具），我们的工具留着 —— 那正是它被造出来的场景；标准类预设下"读一个被你关掉的技能正文"这种管理动作由面板承担。
- **`subagent_manager_run` 的描述删掉与注入重复的那半句**：与官方 `subagent` / `subagent_fork` 的分界规则，注入通道的 `how` 行（`context-inject.ts` 的 `DOMAIN_FRAME.subagents`）已经逐字说过一遍，而两份都在每轮上下文里 = 同一件事付两次 token。留注入那份（它出现在"正在选工具"的那一刻）。实测 1,808 → 1,628 字节（452 → 407 tok），全表 3,498 → 3,453。代价如实记下：把子智能体域关掉、或走压制型预设时，那句分界就没人说了 —— 模型只剩描述与 `agent` 参数说明（"Persona name from subagent_manager_list"），够它认出这条是带人设的委派通道，但"没有人设贴合时才用官方那两个"没了。

### 修复

- **自定义技能目录里的技能"列得出、调不动"**：技能页与官方目录都会把 `~/.dsh/skills-SuperWork`（及任何自定义目录）里的技能列给模型，模型照名字去调却拿到 `unknown or no longer available`。根因是 provider 内部两份清单：列表用 `userRoots() + customRootsFromState()`（全集），`getProviderSkill` 却只用 `rootByKey()` —— 后者只看五个静态根，自定义根住在状态文件里恒取不到，于是静默返回"没有这个技能"。补上按 `custom-<hash>` 解析那支。**已用真实数据核验**（修复后取回 6109 / 2260 字正文）。
- **「采纳」不再把「已清空」通知当成正文**：那句提示写的是"调用发生时正文正在上下文里"，代码算的却是"该域在这个会话里说过话" —— 域清空时发的那条通知同样带域标记。结果是**用户把某域关掉之后**模型凭工具描述去调它，照样记一次采纳，第三列其实一直是第二列的复本。建现场集合时按 `form` 挑掉通知条目，并显式移出"正是这一步被清空"的那些域（通知这会儿还没落到会话表面上）。仅遥测判定，不动发送文本与去重键。
- **预览卡把"没在跑的服务器"报成「停用 N 个工具」**：进入场景的预览卡拿 MCP 停用表的**目标态**与现状逐台比对，而"场景里没勾这台 = 整台停用"在计划里就是一条 `服务器/*` —— 于是 6 台**从来没启用过**的服务器被列成「停用 6 个 MCP 工具：context7/*、fastgraph/* …」（用户实测截图）。服务器没在跑的时候，那张停用表只是记账：记成"整台停用"没有任何可见效果，把它读成"要停用它们的工具"是假话。现在工具级只报**前后都在跑**的服务器（逐工具开关真正起作用的情形），服务器级的改动仍由「停用 N 台服务器」那行如实说。
- **README 关于子智能体工具那句是错的**：原文写 `_list` / `_run` "依赖宿主挂载 `dsh-subagent-*`，缺席时**不注册**（此时 13 个，界面不提示）"。读代码对不上 —— provider 缺席不影响注册，是 `ensureProvider` 在**调用那一刻**抛「子代理服务未挂载」；而真正的注册失败会逐个记下来，随子智能体页横幅与 `preset-tools` 的 `unavailable` **显示在界面上**。现在按实际写，并说明那四个管理侧工具与 provider 无关。

---

## [0.12.1] - 2026-09-22

### 修复

- **子智能体页的人设名不再被挤成两三个字符**：以前名字和描述挤在同一横排里、右边还压着开关和两颗按钮，长名字显示成 `co...`。现在分成两行，名字独占一行、装不下才按省略号截断（悬停看全名）。

### 变更

- **客户端类型检查进了门禁**：`typecheck:client` 此前没有任何地方调用，而且是红的。修掉那处错误后并入 `test` 与 `prepublishOnly`。
- **四个注入上限抬高**：记忆段预算 64 KiB → **256 KiB**；技能目录 50 条 → **60 条**；子智能体 40 条 → **60 条**；MCP 50 条 → **60 条**。描述截断窗口不动（技能与子智能体仍 500 字、MCP 备注仍 200 字）—— 技能这项与官方 `dsh-tool-skill` 的默认值同源，抬成两套会让同一技能在不同预设下长度不一致。提示词域未动。

---

## [0.12.0] - 2026-09-20

### 新增

- **兼容页「功能总览」**：一行一个功能点（十几项，第一行是「插件是否完整挂载」），状态由三层合成 —— 装配层（listener / provider / 适配是否真的挂上）＋宿主能力层（探测结果）＋你自己的配置（开关 / 令牌 / 场景锁定）。取值：正常 / 降级（附原因）/ 未启用 / 受令牌限制 / 部分生效 / 不可用。点一行跳到该功能所在的页签；数据全部来自已有缓存，不新增宿主探测。
- **停用的 MCP 工具真的从模型可见的工具表里消失了**：`tools.restrict` 之前是在插件级上下文上调的，官方要求 agent scope、必抛 —— 异常被当成"registry race"吞掉，所以「停用」一直只有执行时拦截这一半。现在按 agent 逐个应用（跟随 agent 上线/下线），重新启用后工具会恢复可见。
- **补丁写入前先做一次解析校验**：复刻官方解析补丁用的 YAML 方言（js-yaml + `!!js` 标签 + 官方那两条断言），写入前判一次产物。判据是**非对称**的 —— 只有"改前能解析、改后不能解析"（＝我们的改动把产物弄坏了）才拒绝写入并保留原文件与备份；改前本来就解析不过（说明复刻过期）照写 + 上报；依赖不在也照写 + 上报。校验结论会出现在兼容页，写入回执也带一条 warning。
- **doctor 新增三项检查**：① 插件运行时按裸模块名要的那几个宿主包（MCP 客户端 / 人设 / AGENTS.md 注入 / 技能目录）是否仍被宿主暴露；② 插件挂载心跳（`tool-management/mount.json`，含 12 个 inject 服务名）—— 官方改名任何一个 inject 服务名时插件根本不会 apply，且官方既不抛错也不打日志，这份心跳是那种情形下唯一的线索；③ 宿主版本与本插件验证过的版本不一致时显式提示。
- **发行物的 `!!js` 表达式自带兜底**：双挂载判定那段表达式在**每次启动**被宿主求值，而那条调用链没有任何保护；现在表达式自己包了 try/catch，出错返回 false（＝不参与判定、保持挂载），绝不把启动流程拖垮。

### 变更

- **宿主补上原生删除入口时，先不切换**：单删与批删两条都改为"上报「宿主已提供原生入口」+ 继续走本插件自有完整序列（级联子会话 + spill + 记账 + 缓存行）"。切过去的代码今天不可达，写成即等于它会在官方补上入口的那次升级上首次运行、且无从事前验证。
- **会话删除的前置检查补齐**：转录清理还要 `readSessionHeader` 与持久化后端的 `locate()`，而它们排在「装写屏障 → flush → detach → 清缓存行」之后 —— 缺任何一个，失败点都会落在中段（转录还在、记账已清）。现在这两项与已有检查一样，在任何破坏性步骤之前先确认。
- **`@deepseek-ai/cordis` 的 peer 下界提到 `^4.0.2`**（对齐宿主实装）；两个子智能体 spawn provider 进 devDependencies（运行时硬 require、此前在本仓库解析不到）；移除没有引用的 devDependency `@deepseek-ai/dsh-user-approval`。
- **依赖投递链写进文档**：`npm run build` 的镜像清单**不含 `node_modules`**，新增的运行时依赖（js-yaml）需要在 profile 侧安装；装不上时校验自动降级为「跳过 + 上报」。

### 修复

- **关掉技能 / 提示词域后，官方那条注入真的停了**：此前拦不拦得住取决于启动时的注册先后 —— 没拦住的那次，官方内容照旧进上下文，界面上也看不出异常。现在位置固定，不再看运气。
- **投影缓存删除屏障的三处缺陷**：① 第三方也包装同一份缓存时，旧屏障退役后仍留在登记表里、被下一次删除复用 → 墓碑拦截静默失效（缓存行可能复活）；现在退役即摘出登记表，且复用前先验证包装器确实在岗。② 首次使用抛 `TypeError`（宿主形状变了）时不再把宿主留在"半个包装器"状态下 —— 恢复原方法并上报。③ 安装期（`requireTable()`）抛错时上报，不再只抛一句裸错。
- **兼容页的删除动作可用性判定与服务端对齐**：此前客户端要求一个可选槽位（`projection.delete-native`），把本机可用的删除显示成不可用；同时服务端运行时真正要求的那条硬前提（投影缓存存储可删行）提升为能力表的正式条目 —— 界面说的和服务端做的从此同一份依据。
- **兼容页的宿主身份锚点与 doctor 同一套策略**：此前运行时只按"插件自己解析到的包"上溯，dev 布局下会比出假的「同一份模块」，出现"界面说 ok、doctor 说 SEPARATE COPY"。
- **工作区实体快照写不进去时不再静默**：写入后立刻读回，没写进去就上报（界面上的会话计数可能不刷新）。
- **几处"只落 console"的装配失败现在出现在兼容页**：技能 provider 装配失败、上下文注入通道装配失败 —— 此前界面看起来一切正常。
- **关域拦截有了顺序自检**：关域生效期间连续多轮一条都没拦到时会提示"可能没拦到（也可能是官方那几轮本来没内容）"。

---

## [0.11.0] - 2026-09-20

### 新增

- **访问令牌可以设置、关闭、修改、删除了**：以前只有「设置」一条路，关掉就等于把配置里的令牌删掉、想再开只能重新输一遍。现在关闭只是"暂时不生效"（令牌留着，随时开回来），新增「修改令牌」与「删除令牌」，状态收成一枚四态胶囊 + 一句实况。
- **批量启停可以撤销了**：MCP / 技能 / 记忆三处批量开关做完后出现一条不会自动消失的提示，点「撤销」按操作前的状态逐条写回。
- **兼容页可以清理旧备份了**（页头「刷新」旁边）：每份备份都是整份配置的副本、凭据在里面是明文，而自动剪枝只保证每层最多 5 份。逐层级选删除份数，弹窗内二次确认，只删备份、不碰当前配置。
- **提示词页与子智能体页可以搜了**：按名称 / 描述过滤，无命中说「没有匹配的…」而不是「还没有…」。
- **兼容体检改为真调一次**：归档 / 解档 / 批量 / 永久删除四个原生入口与会话的 detach / announce，以前只查方法名在不在就判可用；现在各用一个不可能命中的哨兵 id 真调一次，能调通才算数。
- **令牌开启、本次启动还没解锁时，输入框会锁住**：对话走的是 DSH 自己的会话通路，不经过插件的 HTTP 门禁 —— 此前令牌配了没填照样能聊、五个域的注入照样进上下文。现在这种情况输入框直接锁住并说明去哪填，解锁后立刻恢复。

### 变更

- **关闭 / 修改 / 删除令牌都要当场重输一次当前令牌**：解锁过**不算** —— 请求头里那份已验过的凭证对这三个销毁方向一律不作数，否则"能打开界面就能关掉保护 / 换掉凭证"。
- **令牌面板拆成「访问令牌」与「令牌管理」两块，表单全部搬进弹窗**：前者只管本次启动 —— 一枚状态胶囊 + 解锁框，解锁错误直接顶替状态句显示；后者只管配置文件 —— 设置/修改、保护开关、删除、清除令牌四行静态清单，行名/说明/按钮同形同位。页面上不再有会展开收起的东西；成功 = 弹窗收起 + 状态行更新，失败 = 弹窗不关、错误显示在弹窗内；红色只出现在确认按钮上。
- **「保护开关」的方向改按"令牌在不在生效"判断**：用环境变量提供令牌的用户以前会把"开着"显示成"开启保护"、找不到关闭入口；配置文件里没有令牌值时「删除令牌」也不再显示（点了是空操作）。「loader 行读不到」的提示也贴到操作区旁 —— 这一态下写配置必被宿主拒绝。
- **同一类名字的判定口径统一了**：Windows 保留设备名与控制字符一律拒绝；场景名不再接受尾随空格或点（界面与宿主此前各有一套校验、已经分叉）。
- **目录链接不再被跟随**：链接进来的记忆以前列得出来、开关也能开，却永远注入不进去。
- **「打开源文件」限定在技能来源与人设目录内**：这个操作把路径交给系统编辑器，以前只校验后缀。
- **六页搜索改为停手约 200ms 才过滤，列表只在数据或搜索词真变了才重算**：此前每敲一个字就把整份列表过滤排序一遍，而页面上任何一次重渲染（勾一次选、开个弹窗、MCP 每 5 秒轮询）都会再算一遍。
- **会话批量删除不再逐条重扫全部会话**（原先 O(N × 全部会话)，现在这批共用开头取的一次快照）；注入通道与记忆列表也不再反复重读同一份索引（按文件 `mtime+size` 指纹缓存，外部改了下一轮照常生效）。
- **导出加了病态上限**：单文件 32 MB / 合计 256 MB，超了明确报错（不再把"全部正文 + 一份 zip"同时堆在内存里）；注定超限的上传在开始读之前就拒掉。
- **没配访问令牌时，查看明文密钥不再要求令牌**：原先一律拒绝，而那时用户根本没有可填的令牌 —— 点「显示密钥」只有一句"缺少访问令牌"，是条死路。有令牌（含"关掉保护"）时照旧要带对的。
- **「注入」设置块不再因为没填令牌而整块消失**：`inject-settings` / `mcpm-settings` 这两个"读改写"op 的**读**不再按写操作门禁（写仍然要令牌）。

### 修复

- **打码的密钥不再被「保存」写坏**：编辑弹窗预填的是打码值，以前保存会把它当真值写回补丁文件，真密钥永久丢失。现在保存时用原值顶替、没有原值就跳过并提示。
- **宿主没配令牌但浏览器里残留旧令牌时，现在有「清除令牌」入口**：以前那一态整行不渲染，残留令牌没有任何出口。
- **别处触发"去填令牌"时，先收起弹窗再聚焦解锁框**：解锁框在弹窗展开期间是禁用的，直接聚焦会被浏览器吞掉。
- **「令牌未验证」横幅不再盖住宿主的设置窗口**：层级降到插件弹窗之下，并加了关闭键；关掉后本次锁态期间不再出现，解锁后再锁照常回来。
- **堵上「清除令牌后仍可对话」的漏洞**：解锁一次后「清除令牌 + 强刷新」，浏览器里已无令牌、对话却畅通 —— pre-step 门禁读的那颗"本次启动已验过"的闩只置位不清零。现在清除令牌会让宿主把闩重新挂上（`token-unaccept`，不进 handlers、模型碰不到；不要求凭证 —— 它只会收紧），必须重新验令牌才能对话；其它标签页内存里的旧令牌同步作废。
- **编辑 MCP 服务器不再把 URL 里的凭据写成占位串**：URL 查询串是另一种打码形态（`?<redacted>`），现在与 env / headers 同一条规则 —— 没有原值可顶替时拒绝整次保存并提示重填。
- **「设置宿主令牌」不再可能把 DSH 写坏到起不来**：`config:` 形状识别不了时会插入重复键，而官方解析器对重复键是抛错；现在识别不了就拒绝改写并说明。
- **记忆索引损坏不再静默清空配置**：以前解析失败被当成"没有索引"，下一次写入就把空索引落盘，一次损坏丢掉全部启用集合与排序。现在坏文件留存、拒绝写入并说明怎么办。
- **开关状态不再莫名回弹或陈旧**：两个开关同时写同一份状态文件会互相抹掉；现在写操作串行执行，并跟随文件的实际改动。
- **锁定场景正在生效时，不再能通过清空启用集合绕开模型侧的写门禁**。
- **MCP「重启」中断后不再把服务器留在停用态**（恢复写在 `finally` 里）。
- **导入文件不再让设置面板变空白**：渲染期抛错把整棵组件树卸载了。
- **详情弹窗不再被"晚到的响应"搅乱**：连点两条时先发的响应后到会覆盖详情，关窗后晚到的响应还会把它重新打开。
- **「显示密钥」真的能显示明文了**：以前客户端又打了一次码，解锁后看到的仍是 `sk-1****`。
- **「令牌没过」的提示统一成一句话**，不再几秒后自己消失，且在任何弹窗里都看得见（此前弹窗里有的什么都不显示、有的没有跳转按钮）。
- **子代理工具注册失败不再静默**：子智能体页顶部会出黄条说清是哪几个工具、为什么。
- **读不到的记忆不再"人间蒸发"**：文件被删 / 权限不足 / 被锁时会连名字与原因出现在记忆页的告警条里。
- **导出会话不再静默覆盖同名文件**（文件名带短哈希区分，撞名如实报 skipped）。
- **命令行体检（`node scripts/doctor.mjs`）补齐 6 项能力**：删除 / 归档 / 列表路由真正依赖的那些以前不在体检范围，现在 15 项全列。
- **键盘可达**：导入拖拽区以前是 `div` + `onClick`（Tab 到不了、回车也打不开），现在是真的按钮；工具页签补上页签语义与 ←/→/Home/End 切换。
- **开了系统的「减少动态效果」后**，开关、拖拽区、注入预算条不再有过渡动画。
- **批量归档部分失败会在结果里说明**；**人设改名改为原子写入**；**新建 / 导入记忆改为先落索引、再落文件**。
- **技能 / 子智能体 / 记忆三页现在会显示场景与锁定横幅了**：服务端标了、界面读不到（技能页的字段被响应信封挡掉、子智能体页刷新时漏搬、记忆页压根没渲染）。记忆页的写控件在场景锁定时也因此**从未被禁用**过，一并修好。
- **场景锁定期间不再显示「改动会同步写进场景档案」那条长提示**：开关都是灰的，那句话没有落点，与锁定横幅并排还互相矛盾。
- **批量启停的撤销条改成琥珀色**（边框 + 提示句 + 淡底）：它是这次批量操作唯一的补救通道，此前与旁边的普通回执长得一样，扫一眼不会注意到。

### 文档

- **README 补上此前缺失的边界告知**：场景锁定的具体冻结范围、会话永久删除不进回收站、导出是可读转录不是完整备份、白名单会并回全部 MCP 工具、密钥在磁盘上始终是明文。

---

## [0.10.0] - 2026-09-18

### 新增

- **「注入实况」显示每个域的采纳统计**：「注入 N 次 · 调用 M 次 · 采纳 K 次」，勾了开关但模型从没伸手一眼可见；节头并标注本进程观测到的工具调用数，区分「模型没用」与「统计没接上」。
- **人设可配「目录注入」（`catalogDepth`）**：控制常驻人设目录注入到哪一层会话（默认只在顶层），不限制子代理继续嵌套。
- **人设子代理支持 `inherit`**：继承本次会话**已完成**的轮次（本轮内委派仍要写全任务）；贴合人设的任务从此一律走 `subagent_manager_run`，官方 `subagent` / `subagent_fork` 只在没人设贴合或需要后台任务时用。
- **人设新增「输出要求」字段（`output:`）**：一行一条硬要求，单独成节写进子代理系统提示词，并约束父代理的 `task` 只给目标与上下文、不规定做法。

### 变更

- **注入框架重排为 markdown 四级结构**：`##` 标题 + 加粗动作句前置 + 补充动作行 + 取代声明，五域同一副骨架；场景记忆与子智能体引导语同步重写（给判据、给优先级、补触发条件），正文重复标题与「已清空」通知的插件前缀一并去掉。
- **提示词注入不再「裸送」**：与其余四域同款框架且整条包进 `<system-reminder>`（正文里的闭合标记会转义），界面显示来源文件与载入状态，模型侧正文带「来源：」行。
- **关掉「技能」或「提示词」的勾选，官方那条注入一起停**（此前只停本插件自己）；其余三域勾选完全生效。
- **子代理会话不再注入场景记忆**（只在顶层注入），子代理上下文收敛为「角色 + 任务」，需要时用 `memory_manager_*` 自取。
- **人设进子代理系统提示词时带角色框**：`# 角色：名` 标题 + 授权/边界一行 + `## 角色定义` 围栏，不含 `description`，人设文件本身不用改。
- **MCP 列表改为全局在前、同级按名排序**，页面、场景档案勾选器与模型侧清单三处同序。
- **人设目录的注入判据定为「深度 < `catalogDepth`」**；「注入实况」两档状态改称「已注入 / 不在本会话注入」，无正文行不再画展开箭头。
- **五个管理工具的描述回指上下文里的注入块**，目录与工具互相指路。
- **全部服务端错误码补齐双语词条**（此前 15 码无词条，英文界面回退中文原文）；目录选择器与技能详情 frontmatter 标签同样改走词典。
- **README 安全段补充**：栅栏降级面、`dir-list` 暴露面、HTTP 状态码以 `body.ok` 为准、裸 API 退出场景不清启用集。
- **文档更正**：人设「默认停用」（此前写成自动启用）、场景接管期间「应用 = 改绑该场景」（此前写会被拒绝）、「四域开关同步档案」更正为三域（并更正 0.9.1 条目同句）、密钥打码字形改为与实现一致。
- **六个管理页的启用项排到列表前面**：MCP / 技能 / 子智能体 / 提示词 / 记忆 / 场景，开着的浮在上面、停用后落回原位（两半内部保持原顺序，不是按名重排；提示词页没有开关，按「生效中」排）。拨开关引起的换位有 180ms 过渡，搜索 / 筛选 / 折叠与轮询刷新引起的位移不做动画，「减少动态效果」下直接落位。

### 修复

- **兼容页的「访问令牌」块重排**（用户裁定 2026-09-18）：块挪到「注入」**上面**（令牌不过时写操作全被拒，是"先解决才能用别的"的一件事）；状态胶囊只放**短状态**（未配置 / 未填写 / 已匹配 / 不匹配）——上一版把整句"与宿主配置的令牌不一致……"塞进胶囊，一行里两种字号交错，是这块"很杂乱很丑"的主因；次要操作改成一行 quiet 文本按钮（与 MCP 页那排「详情 / 编辑 / 重启」同款，三个带边框的按钮挤在一起边框互相打断是另一半原因）；说明从一整段散文改成**三条短句**（用户原话：写简单简洁一点，用户大致了解就行），版式与「工具能用 ≠ 模型知道」那份清单一致。
- **「令牌没过」的提示统一成一套文案，并带跳转按钮**（用户裁定 2026-09-18）：此前同一件事有四种说法（宿主写门禁、明文门禁两条分支、界面错误码词典各写一套，截图里能同时看到三种），用户无法判断是不是同一件事。现在宿主侧只有 `http-fence.ts` 里的 `TOKEN_MSG_NO_HOST` / `TOKEN_MSG_BAD` 两句（`TOKEN_PANEL_HINT` 拼进去，保证每个出口都指路），界面词典与它们逐字相同；识别按**文本相等**而不是猜关键词（"缺少/未配置"这类词出现在别的提示里会误挂按钮）。按钮挂在共享的 `Notice` 组件里一处实现，于是**任意页面**的令牌提示右侧都会出现「填写令牌」——点了切到兼容页并把光标放进输入框（`ToolsSection` 注册切页签、兼容页消费聚焦请求，两条通路都覆盖：已在兼容页 / 刚切过去）。`apply` **之外**的 CompatPage 用不了 `Notice`，按本页写法手工拼同一套。另加一条契约测试钉住"宿主常量与界面词典逐字相同"——不同则按钮静默消失、同一件事又变两种说法。
- **MCP 详情弹窗里也能看到「显示密钥」被拒的提示**（用户指出）：用户是在弹窗里点的按钮，而提示此前只长在弹窗背后 —— 弹窗盖着它，等于没有提示。现在同一份提示面板在页面与弹窗里各渲染一份（`tokenGatePanel()`），弹窗里就贴在「显示密钥」那一节下面。
- **作用域护栏补上"暂时性死区"这一类**（`test/client-scope.test.mjs`）：`detailNode` 里调了写在它下方的 `const tokenGatePanel` —— 首屏不打开弹窗时那条引用不求值，测试全绿，一点「详情」就白屏（本次差点翻车）。判据扩成两条：跨 `apply` 作用域的**组件引用**、以及同函数内**先用后声明 const**（两种引用形态：组件首参与被调函数）。已用真实代码回退验证过判据抓得到（`L2408 用了 tokenGatePanel，但它的声明在 L2430`）。
- **访问令牌的控制面挪进面板，且只对本次运行有效**（用户裁定 2026-09-18 的三条）：① 宿主没配令牌时，「设为宿主密钥」把 `config.token` 写进 profile 的 `cordis.patch.yml`（新增 `mcp/loader-token.ts` 做行级改写：只动 `config:` / `token:` 两行，注释与 `!!js` 守卫一个字不碰；改前照旧自动备份；空 `config:` 会连块一起删）；② 已配令牌时，填入该令牌点「关闭令牌功能」即把配置里的令牌删掉，重启后不再需要令牌 —— 不需要「先保存再关闭」两步（宿主接受输入框里那个值作为凭证），填错一律拒绝，否则"能开 GUI 就能关掉保护"；③ 填写的令牌与宿主**本次进程的标识**（`token-status` 回 `bootId` = pid + 进程启动时刻）绑定存储，DSH 退出后再启动必须重填，同一次运行内刷新页面不必重填（旧的无归属裸令牌键按过期处理并清除）。两个新 op（`token-status` / `token-configure`）都**不进 `handlers` 表**：前者只需请求头与进程状态，后者如此才能保证**没有任何模型工具能关掉访问令牌**。配置改动需要重启 DSH 才生效，界面用「本次填写 = 已匹配」与「待重启」两处状态如实说清，而不是让人以为点了没反应。
- **新增静态护栏：`apply` 外面的组件不许引用 `apply` 里面的组件**（`test/client-scope.test.mjs`）：这类引用只在 state 有值时才求值 —— 首屏正常、一交互就白屏，且不留任何日志（客户端错误不进宿主日志）。本次「兼容页访问令牌」的第一版正是这么翻的（`CompatPage` 声明在 `apply` 之外，却用了 `apply` 内的 `Notice`，填完令牌点保存即白屏）。判据只查 `createElement(名)` / `h(名)` 的首参，所以不误报：一般化的跨作用域检查会被同名局部变量与参数遮蔽，实测在本文件上能报出 30+ 条假阳性。护栏附一条自检用例，拿一段必然违规的代码喂给同一个判据，避免"没报错"其实等于"没在跑"。
- **访问令牌有了与页面无关的固定入口**（兼容页「访问令牌」块，用户裁定）：此前输入框只长在 MCP 页的服务详情弹窗里，而「缺少或错误的访问令牌」这条错误会出现在**任意**页面 —— 在场景页被拒的用户找不到任何地方能填（实测死路）。现在兼容页显示两枚状态（宿主配置有没有 / 本机浏览器这串对不对）、能填能清，错误文案也直接指向那里；宿主侧新增只读的 `token-status`（只回答"配没配 / 这次带的对不对"，**不回令牌本身**），写操作被拒时回 `code: error.token.required`。
- **打码密钥不再被写回补丁文件**（真实事故）：编辑弹窗的密钥框预填的是**打码值**（列表本来就把它打码了），而写入路径原样接受表单内容 —— 于是「打开编辑 → 改个别的字段 → 保存」就把真密钥覆盖成了 `••••••`，且无法找回（本机 `TAVILY_API_KEY` 即如此丢失）。现在保存前按 `src/mcp/secret-guard.ts` 收敛：有原值就用原值顶替（= 这一项没改），没有原值或原值本身已是打码值时**跳过该键**并回一条提示；新增与 JSON 导入走同一套。出口另加结构性断言（`buildInsertBlock`），任何漏过守卫的调用点直接拒绝写入，而不是写一个假值进去。
- **补丁文件里已存在的打码密钥会被主动报出来**：MCP 列表把它列进告警（`服务器名.键名`），说明真值已丢失、要重新填写 —— 此前这种状态完全隐形，用户只会在下次保存时再撞一次同一个结果。
- **「显示密钥」解锁后能看到明文了**：客户端此前在详情面板又打了一次码（保留前 4 个字符 + `****`），导致配好访问令牌、`mcpm-reveal` 返回真值之后，界面上显示的仍是 `sk-1****`；同时打码字形与宿主不一致，详情里会出现 `••••****` 这种双重打码。现在打码的**唯一出处是宿主**，客户端不再加工。
- **编辑弹窗会说明密钥框里是打码值**：明确「直接保存不会改动它们」「要看原文需要点『显示密钥』并填对访问令牌」，避免用户以为真密钥长这样、或者以为保存会改掉它。
- **场景锁定补齐模型侧**：`mcp_manager_add` / `skill_manager_create` / `memory_manager_write` / `prompt_manager_apply` 四个工具此前绕过守卫，锁定期间仍可调用。
- **记忆怎么删都进回收站**：形态转换与改名此前直接删旧文件（bundle 连附件一起），现在先入回收站再删。
- **`mcpm-tools-refresh` 要求令牌**：它会临时启停服务器并写两次补丁，此前漏在写操作门清单外。
- **子代理结果不再混入思考块**；「没有正文」按收尾原因分档说明，不再一律报「无输出」。
- **人设正文与名字里的 `{{…}}` 不再让子代理启动失败**。
- **子会话里调委派工具不再被本插件拦下**（不再向官方传 `maxDepth`，人设列表也不再按深度过滤）。
- **MCP 状态不再把「连不上」报成「可用」**：可用性只认当前真实注册的工具数；曾连上、当前不可用的如实标注。
- **场景里手动关掉的技能目录 / MCP 服务器，退出场景后正常还原**（快照全量记录进场景前状态）。
- **覆盖导入失败自动回滚**；编辑 MCP 服务器保留手写的 `toolCallTimeoutMs`；整台停用时「上次运行时」工具行不再标「已启用」。
- **场景进行中改 MCP serverName 或人设名，退出场景恢复正常还原**；重启等待窗口内的并发启用不再被快照覆盖。
- **记忆描述含独立 `---` 行不再截断**（此类多行描述改用引号标量序列化）。
- **提示词页「应用」失败现在会显示错误**；手工编辑 memories-index.json 的场景描述会触发注入重算。
- **兼容页「注入实况」的说明不再截断、节头不再错位**；技能页页头按钮窄栏自动收档，「全选」不再折行。
- **访问令牌比较改为常量时间**（双侧 sha256 + timingSafeEqual）。
- **测试与开发工具**：补 parseModeState 透传契约断言；client-render 夹具对齐现行响应形状；check-i18n 修复行首键漏对账；`preview-memory-note` / `preview-compat` 修到可跑。

### 移除

- `./projcache` 子路径导出与 `lib/history/projcache.js`（archive-manager 时代的投影缓存替换实现，与现行「不插入竞争 provider」的架构冲突，仓库与文档均无引用）。若某个 profile 曾用 `dsh-plugin-tool-management/projcache` 挂载过它，删掉那一行。

---

## [0.9.1] - 2026-09-17

### 新增

- **兼容页「注入实况」**：显示最近活跃会话里模型**实际看到**的五域文本，并如实分清「在上下文中 / 未投递 / 官方注入 / 已关闭」——勾了开关却没送到时一眼可见。
- **「全选」统一成「全选 ↔ 取消全选」二合一**（不再并列两个按钮），并给技能管理页、记忆管理页、记忆的每个场景卡片补上缺的批量开关。
- **场景未锁定时页面开关照常可用**，改动会同步写进当前场景的档案（MCP / 技能 / 子智能体 / 提示词**三域**的开关同步进档案 —— 记忆域的开关是单一真相源，不经过档案；锁定才冻结）。
- **人设也严格「退出即还原」**：快照记下进场景时全部人设的开与关，退出逐个恢复。
- **技能管理页每个来源（目录）卡片也能批量开关**，点它或点来源开关会顺带把卡片展开。
- **bundle 记忆在列表里显示附件数量**：多一颗「N 个附件」标签（0 个也显示，灰色），悬停给出总量与文件名，点它打开编辑弹窗并跳到附件区。

### 变更

- MCP 页的「全部启用 / 全部停用」移到页头动作栏，会话页的「全选」移到「导出会话」旁。
- 场景横幅与提示词接管提示改口：从「开关已停用、请到档案编辑器里改」改成「改动会同步写进该场景的档案」。
- 技能目录卡片的「移除来源」改为纯图标按钮（悬停说明后果，点击仍弹确认框）。

### 修复

- **退出模式失败、卡在场景里**：项目级技能来源在恢复时解析不到就中断整个退出，现在按 key 前缀解析，且逐行容错、不再因为一行把人困住。
- **场景内打开技能，档案不跟着变**：同步逻辑读错了开关字段，「打开」被当成「关闭」而跳过写盘；现在按操作名判方向，档案没写成时页面也不再只报「已更新」。
- **被同名技能覆盖的副本、结构不完整的技能不再进场景档案**：前者档案与运行时各说各话，后者曾让整个场景进不去。
- **场景档案的 MCP / 技能 / 子智能体段全勾满仍显示「全选」**（没有「取消全选」态）；并列的「全选 + 清空」收敛成一个按钮。
- **按钮文案一变就把整行挤走**：「全选 / 取消全选」与「刷新 / 刷新中…」的宽度改为按较宽的那份固定，八个管理页一致。
- **点刷新没有「刷新中…」**：MCP / 提示词 / 会话三页的刷新从不立起加载标记，现在手动刷新会真的切过去（后台轮询不算），会话页并补上缺失的失败分支。
- **MCP 工具描述的「展开」按钮**：改为按真实溢出显示，真被裁到两行才给按钮。
- **flat 记忆的描述与「已启用」之间空出一段**：窄布局下空标签行不再占位置。

---

## [0.9.0] - 2026-09-16

### 新增

- **五个域各有自己的上下文注入**（用户裁定）：场景和记忆 / MCP / 技能 / 子智能体 / 提示词各发一条消息、轨迹里各占一行；只改一个域只重发那一条，域被关掉或清空时单独发一条「已清空」。
- **提示词与技能目录两个新域**：官方那两条行挂得到就让官方送（标准等），挂不到（极简）才由插件兜底，不会出现两份；场景提示词与 `~/.dsh/AGENTS.md` 在官方语义里是同一件事，合并为一个「提示词」域。
- **兼容页「注入」块**：总开关「极简模式也注入」+ 五个域勾选，设置存 `tool-management/inject-settings.json`。
- **模型侧信息补全**：技能同名标出 `shadowed by <root>`（被覆盖）与 `preferred`（首选），启用被覆盖的副本不再回 OK 而无效；`skill_manager_list` / `prompt_manager_list` 给出源文件路径；MCP 备注进 `mcp_manager_list` 输出（字段 `user-hint`）；未运行的服务器也显示工具描述（按「上次运行时」缓存），超两行默认折叠。
- **AGENTS.md 预设库记住「最近一次应用」**：手改过全局文件也能答出「来自预设 X（此后文件有变）」，不再退化成全列。
- **`npm run sync:profile`**：把构建产物镜像进 DSH profile——profile 里是硬链接拷贝，构建新增的文件不会自动过去。

### 变更

- **注入不再依赖系统提示词段**（用户裁定）：四个域从 `systemPrompt.section()` 改走官方自己用的那条通道（`agent/pre-step` 合成消息）——persona `complete` 的预设（极简）再也压不掉；内容没变不重发，引导语压成一句。
- **域名与顺序**：`记忆` → **场景和记忆**、`全局提示词` → **提示词**；从左到右 **场景和记忆 → MCP → 技能 → 子智能体 → 提示词**（注入块、可达矩阵、注入消息三处一致）。
- **兼容页「预设注入边界」与页脚重写**：页脚区分「可调用 ≠ 已知晓」——工具任何预设下都可调用，但呈现由预设决定（`ptc` 会把工具编成生成 SDK，要在 `run_code` 里调）。
- **破坏性**：四个工具族改名——`agentsmd_*` → `prompt_manager_*`、`rule_manager_*` → `memory_manager_*`、`skill_mcp_manager_*` → `mcp_manager_*`、`subagent_list/run` → `subagent_manager_list/run`；提示词或工作流里点名过旧名的一起改。
- **插件文件全部收进 `tool-management/` 并按域改名**（`agents-md/` → `prompts/`、`agents/` → `subagents/`、`rules-index.json` → `memories-index.json`、`state.json` → `skills-state.json` 等），启动时自动迁移（只搬不删、绝不覆盖）。
- **四个列表工具默认只列生效条目**（各带 `all=true` 看全量，表头给出全量口径）；工具描述精简 37%。
- **MCP 详情页运行状态改成标题右侧的彩色标签**；备注的模型侧前缀统一为「用户提示：」。
- **场景记忆段排版重做**：场景上提到 `##`、条目挂在各自场景下；名称恒为标题、显式描述进括号；bundle 补一行附件目录与文件名；正文文件 `SKILL.md` → `<名>.md`（旧名只读兼容，不迁移）。

### 修复

- **子智能体人设弹窗三个毛病一起修**：候选不自动拉、已启用模式的名单进不去、「关闭」后再「启动」清空勾选；现在自动展开也拉候选，**点行首即可展开 / 收起名单**，右侧按钮只管启用 / 停用，停用后再启用记得勾选。
- **「预设注入边界」三处口径纠正**：子智能体列答「人设目录到不到得了模型」；技能 / 提示词列以官方为准（官方那条行挂着就是绿的）；MCP 列按提示词平面作答（被压制即红框）。
- **每个场景块恒有一行加粗的「场景说明：」**（未填描述给默认句）。
- **场景内的开关统一收归档案**（四域同口径，模型工具同样拒绝）；改档案立即生效、失败如实回报。
- **人设域与 MCP / 技能进场景按档案勾选集全量对齐**（整段未定义 = 全部停用），退出按快照双向还原。
- **场景接管提示词时四条状态共用一套事实**：只有场景绑定的那份可「重新应用」；删除保护扩成引用清单；文件被手改时两页都标出「文件里不是它」。
- **场景退出后 MCP 行「开关已关、进程已停、却仍显示已运行」**：补丁说停用即不可能在运行，显示跟着控制面走。
- **「N 个工具」不再把停用工具算进去**（有停用时显示 `可用/总数`）；工具全被停用的服务器不进段。
- **场景名与记忆名相同会「吃掉」整个场景**：统一为「根下的一级目录恒为场景」（发现 / 定位 / 导入三处）。
- **进场景被关掉的人设，退出没开回来**：快照名单落盘读回时被剥掉，现在原样透传。
- **未启用的场景不再整片标红**：记忆页里「场景未启用」此前与真问题（游离记忆、被同名覆盖）共用同一个错误色，整块红读起来像出了错；现在未启用 = 灰色置灰（标签同色），红色只留给真问题——场景页与档案编辑器里的「未启用」标签同步改灰。
- **小项**：注入边界提示不再点名工具（此前让模型去用刚用过的工具）；`skill_manager_list` 修影子技能误报停用；删 `subagent_manager_list` 空参数 `scene`、修 `create_skill` 老文案。

---

## [0.8.5] - 2026-09-16

### 新增

- 场景级 MCP 服务器备注：场景档案的 MCP 段可为每台勾选的服务器写专属备注，进入该场景时覆盖全局备注（写入 notes.json），退出场景时按快照恢复改动前的备注；未配场景备注的服务器照常使用全局备注。
- 未运行服务器的工具可见性：新增「已知工具」侧车（`dsh-plugin-tool-management-mcp-tools.json`），枚举到 live 工具时按服务器记下名单——未运行的服务器不再永远显示 0 工具，工具勾选框也能列出最后一次见过的工具。从未运行过的服务器可在编辑弹窗点「启动服务器读取工具」：临时启用、轮询等工具注册（≤30s）、记入名单后恢复原启停状态。

### 变更

- 新增技能 / 子智能体 / MCP 一律默认不启动（用户裁定，三域同口径）：新建与导入的技能显式写入停用名单；新建/导入/回收站恢复的人设默认停用；新增 MCP 服务器创建即停用（显式传 `enabled: true` 才创建即启动）。启动与否由用户手动开启。
- 场景档案 MCP「编辑」弹窗重做：行内备注输入框移除，「选工具」改为「编辑」，点击打开固定尺寸次级弹窗——第一栏备注、第二栏工具勾选（含全选/清空），有备注的服务器行显示「有备注」标签。
- 系统提示词注入段文案优化：子智能体人设段措辞改为「可从下面的人设中选用」（此前读起来像"只能调用这几个"），并补充委派机制说明；场景记忆段标题下加固定引导语，让模型明确这是当前场景的常驻参考知识；MCP 备注前缀由「用户备注：」统一为「备注：」。
- peer 依赖去掉 semver 上界（`>=0.1.5-rc.2 <0.2.0-0` → `>=0.1.5-rc.2`）：宿主跨 minor 升级不再被 pnpm peer 校验挡住安装，兼容性改由运行时能力探测兜底。

### 修复

- 历史页「已移除」标签红灰两色统一为灰色：此前红色 = 从未登记、灰色 = 曾登记被移除，颜色区分无实际意义。
- 目录真实存在但没有「重新登记」按钮：`canRegister` 判定从「宿主会话索引命中」放宽为「磁盘目录真实存在」（带 stat 缓存，同一目录只探一次盘），与 `registerWorkspace` 的 realpath 目录校验一致——目录在即可一键重新登记；目录已删除的组显示「⚠ 目录已不存在」提示。
- MCP 状态段缓存不刷新：MCP 工具加载完成（`tools/change`）与进/退/切换场景后均主动重算状态段——此前段停留在「空/旧集合」的缓存值，出现「切换 MCP 后系统提示词没有 MCP 段」「退出场景后备注看似没恢复」的现象。
- 退出场景备注永不回退：rules-index.json 读盘时的快照规范化按白名单解析，漏掉了 `snapshot.mcpNotes`——进入时拍下的恢复名单一读回来就被剥掉，退出模式拿不到名单、备注永远停在场景值。现已透传该字段（并补进入覆盖/退出恢复/未勾选不触碰三条直证回归测试；未勾选服务器的场景备注不再在进入时覆盖其全局备注）。

### 说明

- 人设"文件缺失 = 全部启用"的老数据兼容语义保留：只有首次新建/导入/恢复时物化现状并排除新名；已有技能与人设的启用状态不动。

---

## [0.8.0] - 2026-09-15

### 新增

- 场景锁定：锁定后 MCP / 技能 / 子智能体 / 记忆 / 提示词五个域整体只读；未启动不能上锁，锁定中不能关闭或切换，先解锁再改。
- 子智能体开关：停用的人设不注入上下文、模型不可见（文件不动）；新建 / 导入 / 回收站恢复的人设自动启用，首次升级全部启用。
- 场景联动：启动场景时档案勾选的子智能体自动启用，退出按快照精确停回。
- 子智能体人设目录进入系统提示词：只列名字 + 描述，正文仅在委派时传给子代理。
- MCP 服务器状态与用户备注进入系统提示词：只列当前真正可用的 server，备注作为决策提示带给模型。
- 四个管理域补上导出（技能 / 子智能体 / 提示词 / 记忆）：勾选条目打包 zip 写到指定目录，只读源文件。
- 提示词预设支持描述：只显示在插件界面，不写进 AGENTS.md。

### 变更

- 导出弹窗重做：固定宽高、默认不勾选、条目分组折叠（技能按来源文件夹、记忆按场景、会话按工作区目录），组内同名条目全部展示。
- 导入入口统一：提示词补上与技能页同源的导入弹窗；四个导入弹窗一律用「文件要求」清单。
- 删除场景不再要求先清空：连它下面的全部记忆一起进同一条回收站条目，恢复按原路径整条放回；使用中的场景仍拒绝删除。
- 场景名与人设名可以改了：改名连带目录与档案绑定同步；保留场景、重名、正在使用的场景明确拒绝。
- 场景开关成为唯一入口：打开 = 进入场景（应用档案 + 启用），关闭 = 恢复全局默认；「退出模式」与开关走同一条路径。
- 记忆改为单一真相源 `enabled`：档案弹窗的勾选就是记忆自身的开关；新建与导入的记忆默认不开启。
- 提示词「应用」生效时机口径修正：下一轮对话即生效（宿主每轮重读 AGENTS.md），不再说「新会话生效」。
- 技能回收站弹窗重做：上下两块（目录 / 技能）各占一半、各自滚动，两组的后果差异写进界面；入口移到工具栏。
- MCP 新增默认级别改为全局；「Profile 级」更名「应用级」，级别下拉全局在上。
- 界面统一化：按钮四级语义、列表类弹窗固定尺寸且只允许列表层滚动、工具栏顺序固定、命名统一「新增 / 导入 / 导出 + 页名」；提示词 / 子智能体页补统计行。
- 备注输入框加 200 字上限，备注标签如实说明（会随请求发送给模型）。

### 修复

- 进 / 退模式报 EPERM 且开关要点两次：索引与技能管理状态的原子写遇文件占用（EPERM/EACCES/EBUSY）自动重试。
- 退出场景模式后 MCP 服务器级与技能目录不回滚：快照的服务器级 / 来源级名单在读盘时被剥掉，现在原样保留。
- 列表类弹窗条目多时看不到滚动条：列表组被 flex 收缩后条目直接被裁掉；现在列表层正常滚动并带常驻细滚动条。
- 顶部「当前模式」横幅永远不显示：开关与按钮各写一个状态、互不同步，现在两者恒等。
- 长文本排版错位与截断丢失：标题截断补齐并加 `title` 提示。
- 历史页两个工作区分组标签区分无实际意义，统一为「已移除」。
- 兼容页把 semver 上界当受支持版本展示。
- 清理 CSS 死规则、未定义类名与 i18n 死键；滚动容器改为向上查找。

### 移除

- 「切入此模式」按钮（开关承担）。
- 场景档案的 `memories` 段：老档案里的该字段被忽略，不做自动迁移。
- `memoryAllowed` / `computeMemoriesPlan`（单一真相源后不再需要）。

### 说明

- 新建记忆默认不开启是行为变更：已有记忆的 `enabled` 原样保留，不受影响。
- 老数据里 `mode.scene` 与 `active` 可能不一致：不做一次性迁移，下次拨动任一场景开关时自然对齐。

## [0.7.0] - 2026-09-15

### 新增

- 回收站扩到子智能体 / 场景 / 提示词预设三处：删除都进回收站，可恢复或永久删除（恢复绝不覆盖）。
- 子智能体工具限制改为按 Agent 预设：每个预设一份白/黑名单（互相排斥），运行期按当前预设生效。
- 兼容页「预设注入边界」改版：五列标签（记忆 / 提示词 / 技能 / MCP / 子智能体），绿/红/灰框一眼看出哪个域被预设关掉。

### 变更

- 已移除的来源并入回收站（分目录/技能两部分，目录支持永久删除）。
- 五处回收站排版统一（固定高度容器、行内边距收紧）。
- MCP「整理补丁」重新上线：删多余启停覆盖块（生效状态不变），界面只留一个按钮。

### 修复

- 技能页「移除来源 / 恢复读取」死按钮：补客户端 op 映射 + 补进 writeOps 门禁清单。
- `rules-toggle` 不传 `enabled` 时静默 no-op 却返回成功：改为缺参明确拒绝、不写盘。
- 场景档案「技能集」把来源 key 当技能名显示：改为技能名与来源名分开回传，不再显示 `custom-<hash>`。

### 安全

- 明文密钥改为一律要令牌：「显示密钥」与配置导出没配 `token` 时一律拒绝，不再只靠宿主栅栏。

---

## [0.6.0] - 2026-09-14

### 新增

- 「工具 → 兼容」页（第 8 个页签，只读）：宿主版本、能力可用数、每个动作走原生/适配/不可用、降级项与原因。
- `node scripts/doctor.mjs`：命令行版兼容体检。
- `node scripts/host-deps.mjs --fix/--restore`：把插件依赖 junction 到宿主安装。
- 归档分组可重建：工作区登记被删后按会话目录自动重建，可一键重新登记。
- 恢复归档顺带挂回工作区归属（此前会掉进「未分组」）。
- 场景可绑定提示词预设；切换场景直接改写 `~/.dsh/AGENTS.md`（关掉自动恢复基线）。
- 提示词预设库：新建即可写正文、编辑可改 id（= 目录改名，场景绑定自动跟着改）。
- 正在生效的提示词预设不能删除。
- 场景启用改单选（同时只启用一个，新场景默认不启动）。

### 变更

- 兼容判定换底座：源码文本比对 → 模块实体 + 能力探测；拒绝永远在写入之前。
- 技能来源权限语义修正：默认来源必须读取但技能可删；外部目录可停用/移除但技能只读。
- 用户数据搬出插件目录（归档账本等移入 hub）。
- 归档服务改为独立门面：`cordis.patch.yml` 只插入本插件。
- 弹窗按钮统一（取消/关闭只在右上角）。
- 面板语言跟随宿主；会话页与 AGENTS.md 页接入中英词典。
- AGENTS.md 应用保留 5 代备份。
- 提示词预设 id 口径放宽（中文、空格等可用）。
- `history-retention-set` 拒绝小数；`rules-set-active` 必须显式传参；`mcpm-set-enabled` 停用幂等。
- 写操作门禁：先过宿主栅栏，`token` 作为脚本/局域网逃生门。

### 修复

- 进出场景模式会静默改写技能策略（数据污染）：快照只取生效项，已处于目标状态的不再写。
- 导入技能删进回收站拿不回来：按作用域分岔，用户级来源按 key 重新解析路径。
- 技能回收站显示字面量 `undefined`。
- 面板不随宿主语言切换、两页硬编码中文、词条键写错导致界面露原始键名。
- `subagent_manager_run` 确认门早于参数校验：人设不存在时不再先弹卡。
- 删除链路前置实现检查：在任何破坏性步骤之前校验所需方法。
- 英文界面下兼容页结论条仍是中文：改为客户端按当前语言拼。
- 两处过时文案（AGENTS.md 应用说明、创建技能确认卡落点）。

### 安全

- `mcpm-reveal` / `mcpm-export` 额外要求带 `Origin` 头。
- `history-workspace-register` 补入 WRITE_OPS（此前漏了 token 门禁）。

---

## [0.5.1] - 2026-09-13

### 新增

- 场景档案弹窗新加段默认一项都不勾：记忆段只预勾本场景已启用的，其余三段是空集。

### 变更

- 档案弹窗「记忆」段只列被编辑场景自己的记忆。
- 场景页排版重做：卡片只留名字+描述+动作，数量收进页首「当前模式」条。
- 保留场景「全局」不再出现在场景页与档案弹窗。

---

## [0.5.0] - 2026-09-13

### 新增

- 插件自有技能来源「导入技能」（新建/导入落点，优先级高于 `~/.dsh/skills/`）。
- 「移除来源」= 连目录都不再扫描（文件零改动，可恢复）。
- 场景档案编辑器新增第 4 段「记忆」。
- 人设模型与工具限制收进「高级选项」折叠区。

### 变更

- **破坏性**：插件产生的文件全部收进 `~/.dsh/tool-management/`（旧位置自动搬入）。
- 场景升级为显式记录（带描述与顺序）；空场景合法；根层裸 `.md` 不再注入。
- 斜杠命令全部下线。

### 修复

- 工具页整页白屏（`sceneLabel` 闭包作用域错）。
- 导出静默丢失（导出写在 `apply` 体内）。
- Skills 页被锁死（状态文件缺键被判非法 → 改为缺键自愈）。

---

## [0.2.0] - 2026-09-12

### 新增

- 五个域合并进一个「工具」设置面板：MCP / Skills / AGENTS.md 预设 / History。
- MCP：工具级独立启停、重启只重连不改启停、密钥默认打码、改写补丁前自动 `.bak`（保留 5 份）。
- Skills：接入 `~/.agents` / `~/.codex` / `~/.claude` 与自定义目录；创建 / ZIP 导入 / 回收站；目录后台监听自动刷新。
- AGENTS.md 预设库：多套全局基线，一键应用。
- History：归档会话按项目分组、批量恢复 / 删除、保留期清理；从 Claude Code / Cursor / Codex / 任意文本导入；导出 Markdown / JSONL。

> 0.1.1 / 0.1.2 / 0.1.3 没有独立记录（只有 git tag），此处不拆分它们的差异。
