dsh-plugin-tool-management 0.19.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +868 -798
  2. package/README.md +71 -59
  3. package/README_EN.md +91 -80
  4. package/docs/images/1-EN.png +0 -0
  5. package/docs/images/1.png +0 -0
  6. package/docs/images/2-EN.png +0 -0
  7. package/docs/images/2.png +0 -0
  8. package/docs/images/3-EN.png +0 -0
  9. package/docs/images/3.png +0 -0
  10. package/docs/images/4-EN.png +0 -0
  11. package/docs/images/4.png +0 -0
  12. package/docs/images/5-EN.png +0 -0
  13. package/docs/images/5.png +0 -0
  14. package/docs/images/6-EN.png +0 -0
  15. package/docs/images/6.png +0 -0
  16. package/docs/images/7-EN.png +0 -0
  17. package/docs/images/7.png +0 -0
  18. package/docs/images/8-EN.png +0 -0
  19. package/docs/images/8.png +0 -0
  20. package/docs/images/logo.png +0 -0
  21. package/docs/images/promo-cover-EN.png +0 -0
  22. package/docs/images/promo-cover.png +0 -0
  23. package/docs/update.md +31 -520
  24. package/lib/client.js +8308 -6307
  25. package/lib/hub.js +96 -6
  26. package/lib/index.js +54 -2
  27. package/lib/mcp/manager.js +24 -13
  28. package/lib/mcp/secret-guard.js +2 -2
  29. package/lib/memories/constants.js +9 -2
  30. package/lib/memories/service.js +6 -1
  31. package/lib/op-registry.js +22 -7
  32. package/lib/ops/prompts.js +64 -7
  33. package/lib/ops/sessions.js +62 -7
  34. package/lib/ops/trash-retention.js +55 -0
  35. package/lib/ops/trash.js +62 -3
  36. package/lib/prompts/service.js +191 -25
  37. package/lib/scene-prompt-sync.js +1 -1
  38. package/lib/sessions/history.js +32 -22
  39. package/lib/skills/core.js +68 -2
  40. package/lib/skills/manager-state.js +32 -1
  41. package/lib/skills/service.js +7 -1
  42. package/lib/tools/mcp.js +6 -0
  43. package/lib/tools/prompt.js +14 -2
  44. package/lib/tools/scene.js +146 -25
  45. package/lib/trash-retention.js +256 -0
  46. package/package.json +1 -1
  47. package/lib/mcp/inspect-probe.js +0 -199
package/CHANGELOG.md CHANGED
@@ -1,798 +1,868 @@
1
- # 变更日志
2
-
3
- 本文件记录本项目的所有重要变更。
4
-
5
- 格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循[语义化版本](https://semver.org/lang/zh-CN/)。
6
-
7
- - 只想看「大致改了什么」→ [版本更新概要](docs/update.md)
8
- - 功能说明与用法 → [README](README.md) / [README_EN](README_EN.md)
9
- - 工程细节(根因分析、实测数据、设计取舍)在 git 历史里,不在这里。
10
-
11
- ---
12
-
13
- ## [0.19.0] - 2026-10-07
14
-
15
- 子智能体四件事:人设可以标「允许追问」+ 修好自 0.15.0 起完全不可用的 `subagent_manager_run` + 子代理不再把自己当成主代理 + 人设表单的「高级选项」重排;外加「工具限制」的候选修好并分三段。
16
-
17
- ### 新增
18
-
19
- - **人设可以标「允许追问」**:勾上后子代理转后台运行,之后可继续追问。
20
-
21
- ### 修复
22
-
23
- - **修好 `subagent_manager_run` 自 0.15.0 起完全不可用**。
24
- - **子代理不再把自己当成主代理**。
25
- - **修好「模型来源」选定后模型那一格变窄**。
26
- - **注入框架不再点名被工具限制砍掉的工具**。
27
- - **修好「工具限制」的候选不是该模式自己的工具**(此前四个模式列的是同一份宿主平面清单,勾不到 `read` / `write` / `pwsh` 这类官方工具)。
28
-
29
- ### 变更
30
-
31
- - **串行语义改为「至多一次启动在途」**。
32
- - **人设表单的「高级选项」重排**:五个字段分三组,提示文字由九处减到一处;模型来源与模型改为只从宿主目录里选(选定来源后模型只列该来源的;目录外的旧值原样列一条「目录里没有」,不再有手填入口);收起态摘要最多两行、只报有值的项。
33
- - **「工具限制」的候选按「插件工具 / 官方工具 / 其他工具」分三段**。
34
- - **「工具限制」的候选不再返回全体并集**。
35
-
36
- ---
37
-
38
- ## [0.18.5] - 2026-10-05
39
-
40
- 会话导出分三档累进(仅正文 → + 工具 → + 思考)+ 导出弹窗放大到看得到列表 + 导入可以挑工作区;修好行内「恢复」必报操作失败。
41
-
42
- ### 新增
43
-
44
- - **导出分三档,累进**:仅正文 → 正文 + 工具 → 正文 + 工具 + 思考,每一档都是上一档的超集。
45
- - 中间档是这一节存在的理由:**要工具、不要思考**。思考是模型对自己干了什么的叙述,没有工具调用就没有它叙述的对象 —— 反向那一档(带思考不带工具)没有意义,所以三档只可能是这一个顺序。
46
- - 附件(图片 / 文件的名字与大小)跟工具一起进中间档:它属于「对话里出现过什么」,不属于「模型想了什么」。
47
- - 工具结果按上限截断并写明原文总长(一次文件读取就能有几 MB),不设限的话一个会话就能导出上百 MB。
48
- - 附加段各自成节,且载荷整段缩进 —— 工具结果可以是任意文件内容,不缩进的话它里面的 `## User` 会在再导入时把你的轮次劈开。
49
- - 后两档是给人看的,不是拿来回流的:再导入时工具输出与思考会并入助手正文;要回流对话请用「仅正文」。
50
- - JSONL 的 `content` 仍是字符串而不是块数组 —— 块数组会让导入侧把思考又拼回正文,等于把这次修的缺陷原地复活。
51
- - **导入会话可以挑工作区**:三条路并存 —— 从已登记的工作区下拉里选、浏览一个文件夹、直接粘绝对路径。留空仍归未分组。
52
- - 下拉只列活登记的那几个。「已移除」的游离目录不冒充工作区(它按定义就是没登记),要用那个目录请走「浏览」。
53
- - **导出弹窗从 560×640 放大到 720×760**:字段由五行压成三行(格式|导出内容 并一行、会话范围|工作区 并一行),省下的位置全给会话列表。只有列表内滚,提示 / 目录 / 动作行常驻不动。其余四页的导出弹窗与回收站尺寸不变。
54
-
55
- ### 修复
56
-
57
- - **归档列表每行「恢复」必弹「操作失败」**:宿主官方 `unarchiveSession` 是 `Promise<void>`,我们的门面把它的返回值原样透传,op 层再去读 `archivedSessionIds` 就抛 TypeError。崩溃点在**构造回执那一行** —— 宿主其实已经恢复成功、工作区记账也补回来了,用户看到的却是一句失败,而且列表不刷新,得手动刷一下才发现它好了。现在回执由门面按权威归档集合自造,op 层不再读注册表的返回值。
58
- - **导出的正文里混着思考**:取文本那一步只判「这个对象有没有 text 字段」,而思考块 `{type:'reasoning', text}` 恰好符合,于是思考一直和正文拼在一起导出去。现在按块类型取文本 —— 同一条缺陷 0.16.x 已在子智能体侧修过,导出侧是它的第二个出口。
59
- - 副作用要说清:**同一份会话在 0.18.5 前后的导出产物对不上**,少掉的那段就是当初混进来的思考。
60
- - 因此「只有思考、没有正文」的助手轮次在简洁档会第一次变成导不出来,跳过原因里会写明是档位问题、不是内容丢了。
61
-
62
- ### 变更
63
-
64
- - **导入弹窗那一格改叫「工作区」**(原来叫「项目目录」),与导出弹窗的筛选同名同义;文件要求那一行跟着改口。
65
- - **恢复回执不再带 `archivedSessionIds`**:界面只用 `ok` / `error` / `workspace`,而归档集合可能有几千条,每次单点恢复都全量回传一遍没有意义。
66
-
67
- ---
68
-
69
- ## [0.18.0] - 2026-10-01
70
-
71
- 斜杠命令「工具」段 + 快捷提示词(含场景绑定)+ 兼容页两段开关与挂载实况。
72
-
73
- ### 新增
74
-
75
- - **斜杠命令「工具」段**:对话输入框打 `/` 就能进场景、启停技能 / MCP 服务器 / 子智能体 / 提示词 / 记忆,点完菜单不关、接着点下一条。走宿主官方 `inputTriggers` 通道(不改官方包),只放可逆动作。
76
- - 六个域各一行,点一行原地进入该域条目(面包屑「工具 › 技能」);启用项绿色对勾、停用项空心框,右侧灰字是条目自己的备注,域行右侧是当前态摘要。
77
- - 条目按域内唯一的 `key` 定位(技能与 MCP 服务器会重名);点下去先叠本地乐观状态,写成功后按官方口让菜单重取一次候选。
78
- - 每个外部技能目录多一行「目录名 · 目录」,开得也关得;列表全量给出不截断,技能按来源目录、记忆按场景分组,已启用的在前。
79
- - 场景域不列两个恒开的保留场景;记忆域默认带上「全局」那一组并钉在最前面。
80
- - 半截 token 直接按 Enter 会被拦下,不会当普通消息发给模型。
81
- - **快捷提示词**:提示词页拆成「全局提示词」与「快捷提示词」两段。快捷词不注入上下文,在 `/` 的「快捷提示词」段点一下把正文原样贴进输入框(不自动发送);与预设两份存储(`hub/quick-prompts/`),每条一颗开关管它在不在 `/` 里。
82
- - 新 op 8 条(list / create / update / toggle / remove + 回收站三条)逐条登记进 `op-registry`,写侧与五个管理域同一条门禁。
83
- - 数据纪律与预设同级:删除进回收站、可勾选导出成 zip、随整机迁移快照走。
84
- - **场景可以绑定一组快捷提示词**:「修改场景」里那颗下拉默认「当前启用的」= 不绑、进出不碰;勾了的进场景启用、其余停用,退出按快照还原。空表是合法值(= 进入后全部停用)。
85
- - **兼容页「斜杠命令入口」一组**:两段各一颗勾选框(新 op `slash-settings`)+ 一枚「已生效 / 未生效」标签(挂载实况由客户端按段上报);功能总览同步多一行。
86
- - **一条全局轻提示 `showPluginToast`**(右下角):斜杠命令是在对话页按下的,`Notice` 长在页签里、那时设置页根本没挂载。
87
-
88
- ### 修复
89
-
90
- - **`scene_manager_switch` 退出场景的回执说「什么都没改」**:判据把"目标就是当前场景"的早退与"真的退掉一个场景"混成同一个形状,模型每次退出拿到的都是 `OK: already in scene「」`。
91
- - **`/` 菜单进 / 出场景不应用、也不恢复档案**:「启用集合与当前模式恒等」这条原本靠每个调用方各调两个 op 维持,`/` 那一行只调了一个。现在收到服务端兜住,面板 / `/` / 模型工具都只发一次调用。
92
- - **分组卡片点标题收不起来**(MCP 页 0.11.0 起、提示词页两处):写进"收起 = true"那张表里的值取反错了,每次点击都把同一个值写回去。
93
-
94
- ### 变更
95
-
96
- - **档案摘要与切换回执补上「模型工具表」这一档**:`scene_manager_list` 多一格「工具表方案「X」」,切换回执多一句「切到方案「X」(关 N 条)」/「按进场景前的快照还原」;名单本来没变就一句都不说。模型侧不提快捷提示词。
97
- - **`/` 的「工具 › 提示词」域里两类提示词都是启停行**,贴文字改由「快捷提示词」那一段常驻承担(两个源、两件事)。
98
- - **提示词页两组换成技能那样的可折叠卡片**(卡片头 = 组名 + 条数);快捷那组卡片头给「全选 / 取消全选」,全局那组不给(单选)。
99
- - **全局提示词的「应用 / 重新应用」两颗文字按钮换成一颗药丸开关**(在「编辑」左边):亮着的再点一次 = 重新写回 `AGENTS.md`。
100
- - **「修改场景」弹窗分两模块**(基本信息 / 场景绑定),快捷提示词的勾选清单换成段卡片(段头计数 + 全选,段体按内容长)。
101
- - **模型工具表里「提示词」这一组改口「全局提示词」**,两条工具的说明点明只管写进 `AGENTS.md` 的基线;没有为快捷提示词新增模型工具。
102
- - **含下拉与勾选清单的字段外层 `label` 改 `div`**:嵌套 label 会把"点段头空白"转给勾选清单里第一颗复选框。
103
- - **场景档案弹窗的段脚注撤了**(同一件事在段头计数、未定义提示与脚注各说一遍)。
104
- - **「新增提示词」弹窗删掉「或从现有预设复制」那一格**(`agentsmd-create` 的 `from` 参数保留,只是界面不再给入口)。
105
-
106
- ---
107
-
108
- ## [0.17.0] - 2026-09-30
109
-
110
- 对抗性审查收尾:三批(P0/P1/P2 表 19 条 + §5 脆弱性地图 F1–F12)与随后一轮复审(14 条发现 + 2 条替代项)全部处理完毕,逐条到终态;P0 / P1 每条都先复现坏行为再修。报告与终态处置表在 `review/`(本地工作稿,按 `.gitignore` 不入版本库)。
111
-
112
- ### 修复
113
-
114
- - **记忆索引:一次读失败不再等于「整份配置被清空」**(P0-1):读失败(EACCES / EBUSY)曾被当成「没有索引」,随后任何一次写都会把空索引落盘,界面 5 秒轮询的读操作也会触发。现在只有 ENOENT 算新用户,其余读失败一律按「不可信」处理(拒写 + 界面按全部未启用显示)。
115
- - **场景回收站:含子目录 / bundle 记忆的场景恢复不再必然失败**(P0-2):负载名拒收带 `/` 的名字,而场景记忆天生是目录树 —— 删除能成功、恢复必失败且不可再恢复;删除回滚失败还会把回收站条目整条删掉。现在负载名支持安全相对路径,恢复失败退回回收站,回滚没做完绝不清理条目。
116
- - **记忆回收站恢复不再能写到记忆根之外**(P0-3):条目里的组名是磁盘数据,`../..` 能把正文写到记忆根外。现在与回收站列表同一道判据,并在落盘前核对落点是否在根内。
117
- - **整机迁移快照不再导出明文凭据**(P0-4):默认导出只认 `key` / `token` / `secret` / `password` 四个参数名,`?api_key=` / `?access_token=` / `?sig=` 等全部漏掉。现在与 MCP 列表同一套打码,并补上非绝对地址的兜底;`$VAR` / `!!js` 这类间接引用改回原样保留。
118
- - **MCP 体检不再回未打码的地址**(P0-5):它是免令牌的只读操作,却把配置里的 URL 原文回给客户端。现在地址一律打码后回(主机与路径保留),命令名仍明文(与 `mcpm-list` 口径一致)。
119
- - **注入取数失败不再伪装成「已清空」**(P1-8 / F2):某个域抛异常时被当成「这轮没内容」,还向模型发一条假的「已清空」,界面显示成「未投递」。现在异常与真的空分开:抛异常的域这轮不发,「注入实况」新增「取数失败」状态,兼容页那一行同时承载装配失败与运行期失败。
120
- - **读失败不再改名用户文件**(本版自查):上一批把读失败也接到「改名留存」那条处置上,而读失败常是瞬时的 —— 等于把「重试即可恢复」升级成「记忆全没了」。现在两条路分开:解析失败照旧改名留存,读失败只标记不可信、不动文件,下次读成功自动解除。
121
- - **场景改名 / 删除→恢复不再丢记忆的索引条目**(P1-1):改名没搬每条记忆的启停 / 排序 / 标签 / 置顶 / 备注,这些条目被当悬空引用清掉 —— 用户显式停用的记忆会自己重新启用。现在改名按前缀整体迁移,删除时一并收进回收站、恢复时合并回来。
122
- - **删除 / 恢复场景不再跟随目录链接搬走根外文件**(P1-2,已实测复现):`memories/<场景>` 若是指向根外的链接,列目录会列出链接目标的内容,删除会真的把根外文件搬进回收站。现在动手前核对落点是否在根内,遍历时跳过链接。
123
- - **MCP 导出不再谎报「hub 目录写入失败」**(P1-3):它把一份 JSON 交给了只接受补丁格式的写入器,校验必然失败且错误被吞,界面给的诊断是错的。改用普通 JSON 写入。
124
- - **停用的 MCP 工具不再能被调用**(P1-4):`mcp__<server>__<tool>` 对 `__` 有歧义,而守卫取第一个 `__`、列表取最后一个、场景档案又取第一个 —— serverName 含下划线时守卫查表不命中即放行,这是**执行侧**失效。现在三处共用同一个切分函数 `splitMcpToolName`。
125
- - **重复 loader id 守卫不再只扫 MCP 行**(P1-5):导入一条非 MCP 条目就能撞出重复 id,而同 id 会让插件组装失败、DSH 起不来。现在扫全部 insert 子条目(顶层覆盖块不算)。
126
- - **整机迁移的技能域从「永远不工作」到能用**(P1-6):导出侧读错返回结构,技能永远导出 0 项而界面显示「迁移完成」;导入侧又把 zip 喂给只认目录和 `.md` 的入口。现在导出按正确结构展开,导入改走能吃 zip 的链路。
127
- - **`history-delete` 收敛到「只能删已归档会话」**(P1-7):批量删除一直求交归档集合,单删却直接删 —— 一个客户端 bug 就能永久删除任意已保存会话。现在单删也先确认在归档集合里(查不到归档状态即拒绝)。
128
- - **场景绑定的预设正文有了与 AGENTS.md 相同的注入预算**(P2-1):AGENTS.md 分支有 64 KiB 截断,场景分支一点上限都没有。现在复用同一套截断与提示。
129
- - **全局 AGENTS.md 与场景基线快照改为原子写**(P2-2 / P2-16):AGENTS.md 是宿主每步都重读的文件,中断可能留下半截内容进模型上下文;基线快照损坏会让「退出场景恢复 AGENTS.md」静默失效。现在两者原子替换,快照读不出来时如实报警。
130
- - **编辑 / 删除 MCP 不再删掉手写 `config` 的覆盖块**(P2-6):补丁按条目 id 生效,手写配置是合法用法,删除时却被整块带走。现在只删纯块;「启停值读不出来」(如 `!!js …`)也不再被当成显式启用。
131
- - **去重读的不再是「另一个文件」**(P2-19):全局指令路径有两条来源,去重时用了不是宿主实际读的那一份,同一份预设正文被注入两遍。现在由调用方把宿主实际读的那一份喂进来。
132
- - **保存场景档案不再抹掉别的场景**(P2-3):档案切片在写队列外读、队列内写,窗口里另一个写者的改动会被陈旧整片回写覆盖。现在每次写显式声明改哪几片,档案另走逐场景增量。
133
- - **场景名口径统一:命名用单段、定位用完整路径**(P2-4):多段名(`a/b`)能通过校验并被写进启用集合,但注入时两边对不上,表现为「开关点了、场景没生效」且零报错。现在命名路径必须单段(多段当场报错),定位路径按完整路径寻址。
134
- - **备份名加上毫秒与进程内序号**(P2-5):时间戳只到秒,同一次操作连写两遍时后一份覆盖前一份,「保留 5 份」实际变成「保留 5 个秒」。两代格式都认,存量备份仍会被清理。
135
- - **行级编辑不再改坏块标量**(P2-7):折叠空行会把 3+ 连续换行折成 1 个,而块标量(`!!js |`)的内容就是换行与缩进 —— 折一次等于改写用户手写的表达式。现在跳过块标量内部,认不出形状时退化为旧行为。
136
- - **`tools.restrict` 缺失时不再静默**(P2-8):全局 tools 面没有 `restrict` 时直接返回,停用工具仍留在模型可见的工具表里,兼容页还报「ok」。现在与另一处同 id、同文案地上报。
137
- - **整机迁移导入不再吞掉各域的「需要注意」**(P2-9):只取成功 / 跳过数,于是「这些密钥已是打码占位符,请重新填写」到不了界面。现在透传并渲染(记忆域带上跳过原因,上限 5 条)。
138
- - **`mcpmRestart` 不再把服务器留在停用态**(P2-11):某些形状下(条目自带 `disabled: true`、靠覆盖块启用)恢复步骤会把生效值回落到条目自带值。现在恢复前比对一次,不等就显式写回。
139
- - **令牌操作不再把「覆盖条目」当成「第二份补丁」**(P2-12):判据只对 insert 条目成立,而 0.1.7 bundle 挂载下令牌的写点就是覆盖条目 —— 那种安装下所有令牌操作被全量拒绝。现在按形状分类,写点优先取覆盖条目。
140
- - **不可解析的超时值不再写成 `NaN`**(P2-13):手写补丁里 `toolCallTimeoutMs` 被读成字符串,`Number("30s")` 直接把 `NaN` 落盘。现在认不出来就整行不写,`0` 也不写。
141
- - **「已知工具」侧车的读-改-写整段进写锁**(P2-15):两个并发写者各读旧表、各并进自己那台服务器,后写的整份覆盖先写的。现在锁内读 → 合并 → 落盘。
142
- - **技能上传不再能从暂存目录逃出去**(P2-17):路径校验只挡「正好是 `..`」的段,而 Windows 会裁掉段尾的空格,`.. ` 等于 `..`。现在按段判「会不会被文件系统改写」,正常点文件(`.DS_Store`)照常放行。
143
- - **子智能体列表不再列出管不动的隐藏人设**(P2-18):隐藏名(`.foo`)被判 hidden,列表里却出现一个「看得见、改不了、删不掉」的人设。现在列表侧与校验侧同一道谓词。
144
-
145
- ### 修复(复审)
146
-
147
- - **`skill-trash-delete` 的路径穿越堵住**(F1,P0):`id` 直接拼进回收站目录路径,`id=".."` 就能把整个 `hub/trash` 交给系统回收站。现在走既有的单段名校验。
148
- - **「读改写例外」不再被借道**(F2,P1):`tool-table` 免令牌的依据是「纯读」,而「保存方案 / 删除方案」走同一个操作名却会写侧车。现在写条件改为数据化声明:带写触发键就必须过令牌。
149
- - **场景锁定对模型面生效**(F3,P1):冻结只包在界面那条入口上,锁着一个非活动场景时模型仍能改技能 / 记忆 / MCP / 子智能体 / 场景档案。现在两侧同一份判据;「锁着仍能解锁、仍能退出场景」用契约测试钉住。
150
- - **打码 URL 不再被写回补丁**(F4,P1):新增 / 导入 MCP 拿到的是已打码的地址,写回时不做还原,`%3Credacted%3E` 真的落进补丁。现在所有写路径强制还原,还原不出来就报错要求重填。
151
- - **打码链补上 userinfo 与 fragment**(F5,P1):`https://user:pass@host/…` 与 `…#access_token=abc` 原样输出,而这两种形态在托管服务里都常见。现在一并打码。
152
- - **块标量识别按 YAML 规范补全**(F6,P1):识别只认 `|` / `>` 紧跟指示符的形态,`!!js |` / `&a |` / `|2-` 都不算,照样被折 = 改写手写表达式。现在按规范最小集补齐,另加「认不出的疑似块标量头 → 整份文件不折叠」。
153
- - **注入通道的「取数失败」覆盖到域内部**(F7,P1):上一轮只堵住通道拿到异常那一层,而某个域自己就把 IO 错误吞成空串。现在域内部也把 IO 失败与真的空分开;文件不存在仍按正常空处理。
154
- - **「首选」对模型真正生效**(F8,P1):界面与模型侧共用同一个分组函数,而 provider 那条路径没传 `preferred` —— 同名首选只影响界面显示。现在 provider 路径传上;首选来源处于停用时如实回报「已记录,但它不会生效」。
155
- - **单删的归档判据取权威集合**(F9,P2):单删用有损投影(头部读不出来的会话被静默跳过),批量路径用权威集合 —— 同一份数据两条路结论相反。现在单删也取权威集合。
156
- - **「只能删已归档」成为不变量**(F10,P2):级联删除按父子关系直接删、不问归档集合,删一个已归档父会话会连带删掉未归档的子会话。现在只吃已归档的子会话,读不出归档状态时什么都不级联。
157
- - **记忆回收站恢复失败会回滚**(F11,P2):复制中途失败留下「半放回 + 目标已非空」,而条目还在 —— 下一次恢复撞「同名记忆已存在」,这条记忆再也恢复不了。现在失败时清掉落点并保留条目,可直接重试。
158
- - **`.txt` 按内容嗅探,不再一律当纯文本**(F12,P2):改名成 `.txt` 的 JSONL / Markdown 转写会被整份折成一条 user 消息,而返回的是「导入成功」。现在先嗅探,认不出且行数不少时如实提示。
159
- - **引用探测失败不再放行删除**(F13,P2):`refs()` 返回 `null` 时放行 —— 删掉被场景绑定的预设会静默让场景驱动失效。现在探测失败一律拒绝,并说明是「探测失败」而非「有引用」。
160
- - **场景基线写失败不再被吞**(F14,P2):失败只写一行 `warn`,AGENTS.md 照旧切进场景态而没有退路,界面零提示。现在返回失败原因,与「AGENTS.md 未写入」分开上报。
161
-
162
- ### 新增
163
-
164
- - **兼容探测表新增 `fs.patch-io`**(F5):补丁文件的读写要经 `ctx.fs` 升级沙箱策略,五个方法任一改名会让 19 处补丁写路径一起报错。现在钉在兼容页上;「参数语义变了」探不到,如实分开。
165
- - **挂载心跳带上宿主进程身份**(F1):额外记 `pid` 与 `hostStartedAt`,`check:host` 据此直接给结论(写心跳的进程还在 → 这一轮确实挂上了;已不在 → 宿主重启过)。局限:进程号会被复用。
166
- - **doctor 新增 `AGENTS.md` 增量刷新的 drift canary**(F3):官方改成事件驱动 / 改 digest 口径时旧正文会继续注入且零报错。现在加一组源码标记检查,缺失时直说影响面。
167
- - **`hostRootCandidates()` 成为「宿主在哪」的唯一口径**(F10):运行时、doctor、host-deps 此前各写一份,doctor 还少了桌面版归档那条(桌面宿主上会报「找不到宿主」或比出假的「两份不同拷贝」)。现在三处共用一份。
168
- - **`mcpmListView` 上报 MCP 工具前缀的漂移**(F6):前缀抽成 `MCP_TOOL_PREFIX`(唯一一处)并加一条 inform-only 上报。判据是「`mcp` 词根后换了分隔符」且至少两个同名根的工具 —— 第一版没排除本插件自己的 `mcp_manager_*`,会让这条在每台机器上误报,已自查改掉。
169
- - **服务器名的 `__` 歧义会出声了**(N2):`serverName` 允许含 `__`,于是「`a` 的 `b__c`」与「`a__b` 的 `c`」在全名上同形。本轮不收紧校验,改为加一条 inform-only 上报,两种形状取更具体的那条只出一行;判据是纯函数且零误报,只上报、不阻断、不自动改名。
170
-
171
- ### 变更
172
-
173
- - **两份 peer range 不再漂移,且明确「不设上界」**(F9 / §5.4):`probe.ts` 与 `package.json` 此前是两个写法(且前者 caret 隐含上界,与注释自相矛盾)。现在两处是同一个字符串并由契约测试钉住;无法用 range 消除的缺口(尚未枚举的新 rc 在 npm7+ 下仍会 ERESOLVE)写进注释。
174
- - **契约测试共补 34 条不变量**(`test/contracts.test.mjs`,三批 18 条 + 复审 16 条):全部钉纯函数不变量与宿主契约,不加界面测试。
175
-
176
- ### 说明
177
-
178
- - **实测**:`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` 正常跑完。
179
- - **先复现再下结论**:复审 14 + 2 条每条都先复现坏行为,修完再把修复回退掉重跑同一份探针 —— 只证明「改完是绿的」不足以说明探针在判别。回退后转红数:F9 / F10 5 项、F11–F14 10 项、N1 7 项、N2 2 项。
180
- - **N1 在本机是 no-op(如实标注)**:本机 7 个已配置 serverName、105 条已知工具,无一含 `__`,停用表为空 —— 三种切法逐条比对 0 条不一致,这次统一切法是为将来修的。**残余风险**:两个真实服务器名互为 `__` 前缀时,守卫(候选必须窄,否则 fail-open)与显示侧仍可能给出不同答案,由 N2 的上报把它变成可见提示。
181
- - **未做的验证**:按 `AGENTS.md`,功能验证由用户在真实环境完成 —— 本次未在真实宿主里点过界面。三处只做了静态核对:`mcpmListView` 的前缀漂移上报、`webServer.register` 失败的运行期上报、备份名的新格式。
182
- - **本版仍未处理的部分**:两份报告里没有了。两处明确不做、记录在案:① §5.4 余下两条属持续维护成本(每出一个宿主 rc 需手工同步 5 处、桌面宿主缺「布局漂移」上报),记在适配矩阵里;② **F15 不收紧**(拒绝含 `__` 的 `serverName`)—— 今天放行 `__` 的 5 处校验一旦收紧,存量服务器会从「能管」变成「管不了」,改由 N1 + N2 处理。
183
-
184
- ## [0.16.6] - 2026-09-30
185
-
186
- 官方内置技能管理补全 web 侧:web 宿主照注的沙盒诊断技能接入技能页(可见、可停),Office 三件套按裁定在 web 上一并暴露;并补齐接管后缺失的 LibreOffice Kit 路径段。
187
-
188
- ### 修复
189
-
190
- - **web 宿主注入的沙盒诊断技能现在看得见、关得掉了**(0.16.5 的误判):0.16.5 按「web 不注入官方技能」把 web 整个挡在官方内置管理之外,但官方宿主的沙盒技能门控是 `process.platform === "win32"`(`dsh-sandbox-local` 源码核对)——只看操作系统,web 照样向每个会话注入 diagnose-windows-sandbox-acl,于是 web 上「页面不显示、会话照注入」。现在 web 也物化官方技能并以 rank 599 接管:来源出现在技能页,停用即不注入。
191
- - **接管后缺「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」降级文案 —— 绝不给跑不起来的路径。
192
-
193
- ### 变更
194
-
195
- - **官方内置技能按宿主形态各物化一份**:物化目录从各宿主共用 `$DSH_HOME/tool-management/official-skills/` 改为 `official-skills/<desktop|web>/` 各写各的 —— 0.16.5 靠「web 完全不参与」压住竞态(web 重建会把桌面物化好的 4 个清成它解析到的 1 个,实测),分形态目录让 web 也能参与管理而不互踩;0.16.5 共享布局的顶层残留按已知名单自动清理。启停状态按技能名记在来源 `official` 下,两种形态共用一份。
196
- - **web 技能页也暴露 Office 三件套**(用户裁定):web 宿主不装配 office 插件、不注入,但 npm 包自带完整 assets —— web 上从宿主进程解析链物化后照常列出、可启停(启用后随技能目录注入会话)。
197
-
198
- ### 说明
199
-
200
- - **实测**:官方源码逐处核对(沙盒技能门控 `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 降级文案,正文不含指向不存在布局的路径)。
201
-
202
- ## [0.16.5] - 2026-09-30
203
-
204
- issue #1 收尾与桌面版第二轮适配:兼容页身份比对改为逐包解析、逐包核对(桌面版不再误报「两份不同拷贝」),「全部可用」与「N 项不可用」不再同屏;桌面版注入会话的 4 个官方内置技能接入技能页管理。
205
-
206
- ### 修复
207
-
208
- - **桌面版兼容页误报 5 条「两份不同拷贝」**:宿主侧的身份比对把「realpath 机制整轮不变」错写成了连**解析结果**一起复用 —— 第一个包(cordis)的宿主侧入口路径被当成其余五个包的宿主侧路径,五条全部比成「与 cordis 不同」→ 5 条假阻塞项,banner「能力 18/18 · 全部可用」与红卡「5 项不可用」同屏(桌面版 0.2.0-rc.2 实测全中)。现在逐包解析、逐包取真实形态 —— 解析本就便宜,Node 自身还有缓存;同日新旧对比实测:旧代码 1 真 / 5 假 + 5 条阻塞,修复后 6 真 / 0 阻塞。
209
- - **安装形态下的修复指引不再是跑不了的命令**(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 查看」同理分两键,安装形态下不再指命令。
210
- - **路径取不到真实形态时不再编一个「两份拷贝」的结论**(issue #1 次要问题 2):`realPathOf()` 以前 `catch { return value }`,把「这条路径不可解析」静默降级成「拿输入去比较」—— 于是路径/权限问题看起来就是「插件与宿主加载的是两份不同拷贝」,用户照着它去修只会白费功夫。现在取不到真实形态就**如实记原因**(`error.code` 与消息原文),这类包给 `sameAsHost = null`(比不了)并单独出一条说明,带包名、哪一侧(`host` / `plugin`)、解析到的路径与失败原因;界面显示「无法比较(路径取不到真实形态)」并列出两侧。
211
- - **兼容页不再一边「全部可用」一边挂着红卡**:能力注脚与红卡高亮此前把「身份待处理」(两份拷贝这类 —— 不影响能力可用性)混进了能力降级计数。现在两处只看能力降级数;汇总行三分:全可用 / 能力降级 / 身份待处理(新增词典键 `compat.summary.identity`),各说各的。
212
-
213
- ### 新增
214
-
215
- - **官方内置技能接入管理**:桌面版宿主向每个会话注入 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)不注入会话上下文,不列(用户裁定)。
216
-
217
- ### 变更
218
-
219
- - **源码检出与 npm 安装形态的行为差异,只在指引上一处**:`/dsh-plugin-tool-management` 里有没有 `scripts/host-deps.mjs` 决定给哪句指引(本插件不从 `scripts/` 加载任何东西),其余判定完全一致。
220
-
221
- ### 说明
222
-
223
- - **收尾范围**:issue #1 的主因(`import.meta.resolve` 的 URL 未解码,含空格路径必现;macOS 上开头斜杠被一起删掉)已在 0.16.0 随 `fileURLToPath` 修掉,本版带次要两条的收尾、身份比对的逐包核对与官方内置技能管理。
224
- - **实测**:源码检出与安装形态两种位置的 `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/` 相对结构保留。
225
-
226
- ## [0.16.0] - 2026-09-29
227
-
228
- ### 修复
229
-
230
- - **桌面版被误判成「两份不同拷贝」**:桌面版 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 实测)。
231
- - **宿主版本显示 `unknown`、带空格的安装路径上身份比对必然失败**:`import.meta.resolve` 给的是 URL,插件把 `%20` 当成普通字符留在路径里 —— 「D:\DeepSeek Harness\...」这种路径于是永远打不开,版本读不出来,比对也就必然不等。改用 `fileURLToPath` 解码(0.1.5 起这条路就有,只是此前没人在带空格的路径上装过)。
232
- - **MCP 体检补上端点探测**:此前只查配置格式,一条编造的 streamable-http 地址也能拿绿点(2026-09-29 GUI 测试发现)。现在格式对了就对配置地址 GET 一次 —— 带配置的鉴权头、5 秒超时、不读响应体,与宿主连接该服务走的是同一地址同一头部;连不上点黄,说明里带原因(域名解析失败 / 连接被拒 / 超时 / 证书校验失败)。逐行检查同时改成并行,「全部检查」不再被挂掉的服务按行数排队拖慢。
233
- - **删除 MCP 服务同步清掉引用**:只删补丁行的话,引用它的地方全成死键 —— 场景档案的勾选与备注、停用表、「已知工具」缓存、服务器备注现在一并摘掉;被**锁定**的场景档案是用户显式冻结的,跳过不动并在回执里说明。删除后等宿主 loader 摘条目(最多 5 秒),等不到就明说「列表可能短暂残留它的行,宿主收敛后自动消失」—— 此前那条 `include:*` 残留行无声出现、约一分钟后自己消失,用户只会以为没删干净(2026-09-29 GUI 测试发现)。
234
- - **MCP 页轮询不再空转重渲染**:本页每 5 秒轮询一次,此前即使带回的数据一模一样也整页换一批新对象 —— 缓存计算、React 协调、开着的弹窗全部跟着空转,点击与输入都可能被这阵重渲染打断。现在内容没变就跳过整页更新(2026-09-29 GUI 测试发现)。
235
-
236
- ### 变更
237
-
238
- - **「插件适配版本」改标 0.2.0-rc.2**:桌面版首发版本已实测通过(宿主版本读得出来、18 项能力全通过、归档宿主的身份判定见下条),`VERIFIED_HOST_VERSION` 与 `EXPECTED_PEER_RANGE` 一起加上它 —— 宿主比自己验证过的版本新时,那条「实际宿主与验证过的版本不同」的提示就不再无谓地刷在桌面上(web 宿主 0.1.7-rc.2 会开始提示,这是事实,不是故障)。
239
- - **兼容页的三张指标卡只在有事要说时带注脚**:「宿主版本」下面那行「最低要求 ≥ 0.1.5-rc.2」删掉(那是**安装期**的 peer 下界,摆在这里会被读成对当前宿主的断言)、「插件适配版本」下面那行「本插件按此版本验证」删掉(同一件事说两遍)、「可用能力」全通过时不再写「全部通过」(分子分母已经说了)—— 降级与「缺口由插件自补」两种仍照旧说清楚(2026-09-29 用户裁定)。该 peer 下界仍留在 `compat-status` 的载荷里(doctor 与外部脚本可读),只是不再显示;配套的界面词典键 `compat.peer`、`compat.verified.note`、`compat.caps.all` 一并删掉。
240
- - **四个域的行状态统一成名字后面的描边胶囊**:MCP「已运行 / 未运行」改「已启用 / 未启用」、技能与子智能体「已停用」改「未启用」、记忆「本条已停用」改「未启用」(「场景未启用」措辞不动)。配色按语义分工:绿=生效中、灰=没生效但不是故障、橙=当前没可用工具 / 诊断异常、红=启动失败 —— 停用类不再是橙色。
241
- - **MCP 的体检状态点挪到名字前面**:以前它在标签列里,读一行要先穿过名字才找得到那颗点。点占的 14px 单独成槽,名字、备注与表头一起对齐到槽的右侧(2026-09-29 用户反馈名字比下面的备注右移、没对齐)。
242
- - **子智能体启用时也挂「已启用」胶囊**:以前只有停用的那颗,"没有标签"是不是等于启用得猜。
243
- - **MCP / 技能 / 记忆三页取消「状态」列**:状态跟着名字走之后那一列空了,表头少一项,行网格从四列收到三列。
244
- - **MCP 行固定两行预算**:标签(工具数 / 层级 / 重名)从独立的标签列并进备注那一行 —— 带不带备注的行高一致(此前带备注的要高出约一档),行网格再收到两列、表头只剩「服务名称与地址」。技能与记忆仍是三列。
245
- - **窄档(面板 <780px)的 MCP 行高 81px → 69px**:58px 的行下限是三行时代留下的,动作组又仍跨着两个空行、白付两格行距;两处都按两行内容重算(上下各 11px 内边距不变)。
246
- - **MCP 行去掉「重启」按钮**:重启就是那枚开关的关→开,用户自己拨即可。只有它用的「重启中… N 秒」横幅(连同那枚每秒重渲染的计时组件)一并删除,三处「点「重启」重试」的提示改说「把开关关掉再打开重试」。行右侧剩 开关 / 检查 / 详情 / 编辑 / 删除;模型侧的 `mcp_manager_switch(action=restart)` 与「最近改动」里的重启记录不受影响。
247
- - **MCP 第二行改成标签在前、备注在后**:工具数那枚短事实先读到,长备注留在行尾自己截断。
248
- - **「最近改动」的说明句拆成两条**:「记什么」与「会不会涨」各一条,用字段说明同款的条目样式,不再是一整段;「记什么」那条去掉括号里的补语。
249
- - **「修改场景」的提示词预设说明改成一句**:原来两条(启用即以它为全局基线 / 启用期间应用别的预设 = 改绑)压成「为当前场景设置全局提示词」。条目符号留着,「场景名」的说明也一并挂上 —— 这张表单里字段说明同款(校验报错那句仍是红字,不进清单)。
250
-
251
- ## [0.15.0] - 2026-09-28
252
-
253
- 适配 DSH 0.1.7-rc.2(升级后五处失效逐项修复),并带五件增量功能。
254
-
255
- ### 新增
256
-
257
- - **兼容探测表补上 0.1.7 的两块契约面**:新增 `settings.document-path` 与 `preset.roster-surface`,健康行常显实际观测到的路径 / 读取方式,官方再改语义一眼见底。
258
- - **主目录推导自检**:推导失败从静默抛错升级为具名上报,按不变量自检、恢复即收;名册兜底只在真异常时留痕,健康一律不亮黄。
259
- - **MCP 页「导入 / 导出」**:粘贴社区 JSON 一次建齐,名字净化、传输判定、重名去向在预览里说清;导出含明文凭据警示。服务端零改动。
260
- - **MCP 配置体检**(新 op `mcpm-inspect`,只读):每行一枚状态点,查命令在不在 PATH、URL 写法、字段形状、服务名撞车;配置一改旧结果作废。
261
- - **「最近改动」流水**(新 op `audit-list`):谁、什么时候、动了哪条,三方来源各标各的;只记对象名、参数一律不取,同秒同来源合并展示。
262
- - **场景可绑模型工具表方案**:进场景把关停名单整体换成方案那份,退出按快照还原;绑定入口在「修改场景」表单,改启用中场景立即生效。
263
- - **整机迁移快照**(新 op `snapshot-export` / `snapshot-preview` / `snapshot-import`):一个目录带走全部域,MCP 默认打码;导入先预览、勾选域再执行,逐域走各自的导入口。
264
-
265
- ### 修复
266
-
267
- - **MCP 列表与注入失效**:0.1.7 的 `settings.prepareDocument()` 返回语义变了,插件把 profile 目录当成主目录、读错补丁文件;现在两种形状都认。
268
- - **预设边界整片「无法判断」+ 极简下技能 / 提示词不注入**:0.1.7 把名册 `read` 改名 `readDocument`;读取统一收敛到「`read` 优先、`readDocument` 兜底」一个出口。
269
- - **「判断不了」改「无法判断」**(兼容页两处)。
270
- - **访问令牌卡片的两句文案**:没令牌时不再说吓人的话;「找不到加载器行」改成按用户能做的动作说。
271
- - **技能页误报「无法从宿主读取活动工作区」**:项目目录已删是常态而非故障,静默跳过。
272
- - **host-deps / doctor 找不到宿主**:发现序列加上 npx 缓存扫描;doctor 对悬空老树出一条警告。
273
- - **「设置令牌」在 0.1.7 失效**:bundle 挂载后补丁里没有 loader 行;改写进 profile 补丁的覆盖条目(官方支持的 id 定向覆写),bundle 文件永不落密钥。
274
- - **功能总览「注入域开关」报 6/5**:分母改从 `INJECT_DOMAIN_KEYS` 取。
275
- - **「场景锁定」的灰胶囊标签张冠李戴**:改成独立的「锁定中」。
276
- - **会话列表标题显示成 ID 长串**:调官方投影缓存传参不符官方契约、抛错被静默吞掉,标题从没读到过;改回官方两参签名并加旧格式兜底(2026-09-28 用户反馈)。
277
- - **功能总览在英文界面下半页中文**:句子归客户端词典、数值归服务端,对不上的回退服务端原文(2026-09-28 用户反馈)。
278
-
279
- ### 变更
280
-
281
- - **peer 范围逐代枚举**:改为 `^0.1.5-rc.2 || ^0.1.7-rc.2`;`VERIFIED_HOST_VERSION` 升到 0.1.7-rc.2。
282
- - **恢复归档改走 0.1.7 新增的原生 `unarchiveSession`**:运行时探测自动切到 native 路由。
283
- - **核对 0.1.7 工作区状态新增的置顶字段**:插件全部 `setState` 均为展开式写入,置顶数据不受影响。
284
- - **兼容页三块改成顶部按钮 + 弹窗**:「最近改动」「整机迁移」「注入实况」不再常驻长页;「最近改动」固定尺寸、只滚列表,整机迁移的目录可浏览选择。
285
- - **改动记录可以清了**(新 op `audit-clear`):两步确认;清空本身也留一条记录。
286
- - **「预设注入边界」的行名改成模式名**:标准 / PTC / 极简 / 创造模式,子智能体高级选项四行同批;顺带修好一直显示原始 id 的 trust 缺省错误。
287
- - **场景档案改 2×2 网格,四段同屏**:各段段内滚动,弹窗加大;「子智能体集」「记忆集」更名。
288
- - **兼容页留白收一档**:块间距收紧,分组更清楚。
289
- - **「功能总览」的琥珀只留给功能出问题**:停用类两行恒为「正常」,停用构成写进说明(整台按台、单独按个);「模型工具表」说明收敛成一句。
290
- - **「最近改动」的时间列恒显「月-日 时:分」**:原先当天条目只有时分,跨天分不清是哪天的。
291
-
292
- ## [0.14.0] - 2026-09-23
293
-
294
- ### 破坏性
295
-
296
- - **模型工具改名并合并,共 20 条**:五个「新建」统一成 `_save`(有则改、无则建,回执说清走了哪条);六个域的启停统一成 `_switch`;`mcp_manager_set_enabled` + `mcp_manager_restart` 合成 `mcp_manager_switch(server, action, level?, tool?)`。场景从记忆里分出来,自成一族三条 `_list` / `_switch` / `_save`,记忆族保持 `memory_manager_*`。**旧名不留别名** —— 别名会常驻每一轮请求,比这次省下的还多。
297
- - **出厂默认关掉 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`。判据是这些信息或动作常态下由注入段与面板承担。**只在从没动过那一页时生效**,存过的选择(含"一条都不关")照原样;「兼容」页可逐条打开,也能整批换回。
298
-
299
- ### 新增
300
-
301
- - **模型能进入 / 退出场景**(`scene_manager_switch`):与界面「进入场景」走同一条路径 —— 按档案整套启停 MCP / 技能 / 人设、注入收窄成该场景的记忆、把绑定的提示词写进 `AGENTS.md`(覆盖前留备份)。改的是整个运行时环境,默认要用户确认。
302
- - **模型能查、能建场景**:`scene_manager_list` 列出每个场景的档案、绑定的预设、锁没锁、几条记忆;`scene_manager_save` 建场景 / 写档案 / 绑提示词。档案是**整段替换**,所以清单先看现状、回执再列出被挤掉的项(`mcp 4 项 → 2 项(-B、-C)`)。
303
- - **MCP 三项能力**:改一台已配置的服务器(省略的字段保持原样,全程不碰明文凭据)、只停某个工具、顺手写备注。
304
- - **技能两项**:整个来源目录启停(`source` 参数);改写本插件自己写的那份(新 op `skill-update`)。
305
- - **人设「思考强度」**:在高级选项里与「模型」并排,档位由所选模型声明。换了模型而旧档位不在新清单里会自动清掉并告知;拉取失败不动已存的值。
306
- - **「模型工具表」能存方案**:合计行右侧「保存方案 / 恢复方案」。方案存的是关掉的名单,最多 20 份、名字不能重复(保存永不覆盖);恢复清单第一条是不可删的**出厂默认**,自己存的可在同一弹窗里删。
307
- - **注入按域分家**:「场景」与「记忆」各成一段,可以单独关掉记忆段而保留场景说明。⚠️ 升级后每个会话会重发一次这两段(旧消息认不出来),一次性代价。
308
- - **提示词清单带描述**:模型能在预设之间做选择(描述上限 300 字,输入框有字数计数)。
309
-
310
- ### 变更
311
-
312
- - **注入只写"现在是什么"**:六个板块的"什么时候该想起我"动作句、机制解释、重复的权威声明全部删掉,框架只剩标题 + 正文 + 一句"以本份为准"。四个板块合计 **823 → 643 tok/轮**。
313
- - **注入层级定稿**:板块 `#` / 场景 `##` / 条目 `-`(此前板块标题与记忆里的场景分组平级,模型读不出主次)。
314
- - **场景段只剩一行**:`**「代码」—— 用户描述:写代码**`;一个具体场景都没启用时整段不注入。`global` 的分组标题改成 `## 常驻信息`。
315
- - **记忆段的授权语定稿**,整段只说一次:`以下是当前场景对应的记忆;冲突时以实际情况和用户目前的对话为准;无关勿提;以下就是全部信息:`。
316
- - **MCP 段不再列工具数**(模型拿这个数字做不了事);备注前缀统一成「用户提示:」。
317
- - **关掉的工具不再被点名**:目录截断提示、"没找到 → 去调某条工具"那几句会随开关自动改写,不会把模型指向一条不存在的工具。
318
- - **`tool-table.json` 里的旧工具名自动迁移**(读侧翻译一次并回写盘,幂等),存下的命名方案一起迁移。不认识的名字原样保留。
319
- - **「功能总览」的「模型工具表」一行**改按"用户自己关掉的条数"判状态 —— 出厂默认不算降级。
320
- - **`subagent_manager_run` 描述瘦身**(407 → 338 tok):删掉与参数说明逐字重复的部分,约束一句没减。
321
- - **子智能体高级选项折叠后的摘要固定排两行**,长名字不再被折成竖排。
322
-
323
- ### 修复
324
-
325
- - **工具描述引用的注入板块名悬空**:记忆段拆开后板块标题改了,`memory_manager_list` 还指向旧名字,模型照着找找不到。补了一条契约测试扫描这类跨模块引用。
326
- - **`prompt_manager_list` 报错过「生效中」**:场景接管时它按"文件内容比对"判,与界面两套答案。现在两边同源,并区分 `[active via scene]` / `[active via file]`。
327
- - **改配置会静默清空凭据与思考强度**:`mcp_manager_save` 省略 headers/env、`subagent_manager_save` 省略 `reasoningEffort` 时会被整份重写清空 —— 现在省略即保持。
328
- - **自定义目录里的技能"列得出、调不动"**:读取正文时不查自定义根,静默返回"没有这个技能"。
329
- - **「采纳」统计不再把「已清空」通知当成正文**:第三列此前一直是第二列的复本。
330
- - **记忆正文不再"逃出条目"**:正文里手写的 `#` 会渲染成与场景标题平级的大标题,现在整段包成代码块。
331
- - **MCP / 技能族的悬停不再承诺没有的字段**:此前写着"可带 provider、模型与工具限制",而工具签名里根本没有这些参数。
332
- - **`prompt_manager_apply` 回执的生效时机说错了**:写「next session(当前会话不变)」,而宿主每一步都会 stat 比对并重读 `AGENTS.md` —— 实际**下一轮就生效**。三处口径(回执两条分支、`prompt_manager_list` 尾注)统一,模型不再劝用户重开会话。
333
- - **`scene_manager_save` 的参数说明引用了已删除的授权语**:还说场景说明注入后"模型会被要求照办",与注入定稿(场景段只陈述现状、不带指令)不符;改为如实说明去向(出现在「本机当前的场景」reminder 里),"写成指令而非备注"的写作引导保留。
334
- - **静态描述与回执不再点名出厂默认关闭的工具**:场景族三条的互指改成中性说法(the scene listing / 「本机当前的场景」reminder),`scene_manager_save` 与 `subagent_manager_save` 回执里的 `_switch` 点名按 toolVisible 分叉(部分启用时模型会被指向一条自己没有的工具)。**新增契约测试**钉住「静态 description 不得点名出厂关闭的工具」,与板块名悬空那条同一族。
335
- - **两条清单描述的口径对齐实际输出**:`mcp_manager_list` 不再说"注入的就是这份清单"(注入段是筛过的视图、停用服务器不进 —— 现在把这个盲区写成模型的行动依据:要查停用的用 all=true);`skill_manager_list` 不再说用它"拿正文"(它给的是源文件路径,正文走 `skill_manager_read` 或文件读取)。
336
-
337
- ## [0.13.0] - 2026-09-23
338
-
339
- ### 新增
340
-
341
- - **模型侧补五个工具,15 → 20**:`memory_manager_set_enabled` / `_update`、`subagent_manager_set_enabled` / `_create` / `_update`。分布此前是歪的 —— 技能与 MCP 两域模型能启停能新建,记忆与子智能体却**只读**:看得到一份记忆、看得到一个人设,开关拨不了、内容改不了,只能回一句"请到界面上点"。底层那五个 op 连门禁(写令牌 / 场景冻结 / 档案同步)都齐,缺的只是接线。提示词按裁定只留 `apply`。
342
- - **所有会改东西的工具都写明"要用户开口或先同意"**:启停类一句 `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` 说明了四遍。
343
- - **模型工具表可以关**:工具表**每一轮请求都随工具发一遍**,20 个工具的整份定义合计 ≈3,450 tok(宿主口径:整份 JSON 除 4),这一轮用不上也照付。兼容页新增「模型工具表」块,逐个工具勾选、按域全开全关,关掉的**整份不进请求** —— 只把描述写短是重编码同样的事实,这才是唯一真省钱的杠杆(实测:关掉 6 个管理类工具省 ≈1,115 tok/轮)。数字全部来自**注册时量到的整份定义体积**,界面上的 ≈ 与分组合计同一个来源,默认一个都不关。配套两处:关掉的工具在**执行侧**也拦住(可见性那半边万一没生效,名字也不该被执行),注入文本里点名它的那几句跟着换话术(技能 / 子智能体目录的截断提示与两条 `how` 行)—— 点名一个模型手里没有的工具,只会让它去猜名字。**面板不受影响**:114 个 op 与工具表互不相干,关掉 `mcp_manager_add` 之后 MCP 页照样能加服务器。
344
- - **`skill_manager_read`**:按名字一次拿到技能正文。此前要两步(`skill_manager_list` 取路径 → 自己读那个文件),而目录只有名字没有路径、同名常几份并存,自己挑路径很容易读到被覆盖的影子副本 —— 读完以为在用这个技能,其实生效的是另一份。新工具先走 `skill-state` 的胜出者判定再读,读到的就是目录列出来的那一份。
345
- - **「进入场景」先弹一张卡说清会改什么**:新只读 op `scene-mode-preview` 复用引擎里**已有的两个纯计划函数**(`computeMcpPlan` / `computeSkillsPlan`)与同一批现状读取,只把后面的 `apply*` 与 `saveSlice` 去掉 —— 预览与实际执行不可能各说各话。逐方向列出会启停哪些服务器 / 工具 / 技能目录 / 技能 / 人设。预览失败不拦进入:它是说明卡,不是新门禁。
346
- - **改名留下的悬空引用有地方说了**:新只读 op `state-doctor` + 场景页黄条,把档案与绑定里指向已消失名字的行数出来。这类已经真出过两次(0.9.1 / 0.10.0),而提示词绑定那一连出口都没有 —— 宿主把"绑的预设读不到正文"当成"没绑",界面上那条「预设不存在」标签永远不亮。只数不修:猜着改名字比留着更危险。
347
- - **记忆页每行带出正文字节数**:记忆是唯一直接吃注入预算的域(场景段 128 KiB),页面上却看不出哪条大。读不到文件时**不带**这个字段、界面什么都不显示 —— 把"不知道"报成 `0 B` 是假话。
348
- - **「新增 MCP 服务器」弹窗有了备注框**:随表单一起填,留空 = 侧车里不产生任何条目(不是写一条空串)。与服务器同一次写锁落盘(`id` 只有服务端算得出,重名会加后缀);备注写失败不回滚已建好的条目,原因并进 warning。
349
- - **五处输入加了「字数 / 总字数」**:MCP 备注两处、人设描述、技能描述、记忆描述。分母取的是**注入段的截断长度** —— 不会再出现"界面让你写 500、模型只读到 300"。存量超长的标红。
350
- - **场景页能搜了**:其余六页早有。匹配卡片上真会显示的四样(目录名 / 显示名 / 一行描述 / 绑定的预设 id);三格统计不跟着过滤变。
351
- - **`/` 聚焦搜索框、Esc 清空它**:监听挂在插件自己的根节点而不是 `window`(会连宿主的键一起抢);弹窗开着时整条放行。↑/↓/Enter 留在下一步。
352
-
353
- ### 变更
354
-
355
- - **预览卡补两行「进入后是什么样」**:`启用 N 台 MCP:…` 与 `启用 N 条记忆:…`。上面那些行说的是"会改什么",什么都不变时 MCP 那一段整段消失,读起来像缺了一块(用户 2026-09-23 指出)。服务器那行由引擎算(场景勾着的 ∩ 配置里存在的);记忆那行在客户端算,判据与记忆页那一行同源(`!shadowed && enabled !== false && 场景 active`),只有一处差别:目标场景按"进入后它就是活动场景"算。公共基线与全局不必写死场景名 —— 服务端给这两者的 `active` 恒为 true。
356
- - **预览卡的按钮改成两颗**:「先不进入」删掉 —— 它与右上角的「关闭」是同一个动作的两颗按钮;换成「不再显示」= 关掉卡片 + 以后不再弹(也不进入)。恢复的入口是场景页右上角新增的**「关闭提醒 / 开启提醒」**按钮(文字写的是**动作**:正在弹就写「关闭提醒」)。这项设置落在侧车 `scene-settings.json`,**刻意不进场景冻结** —— 它是界面提示,锁着场景的人在场景页照样该能关掉提醒。
357
- - **预览卡里的技能只显示名字**:键是 `<来源>/<名字>`,而自定义来源的键是一串机器名(`custom-d38da02b873bdb5c/brainstorming`)—— 铺在卡上没人认得出那是哪个技能,现在只取最后一段。
358
- - **注入实况那三个数改成只数「最近这一段对话」**:投递 / 调用 / 采纳原来是进程级累加,开着 DSH 用一下午之后「注入 8 次 · 从未调用」讲的是"今天这台机器",而人看这块面板问的是"我眼前这一段里模型用没用"。三组计数改挂按会话身份建的账本 —— 身份本来就有(采纳判定的"正文在不在现场"早就按 agent 记),改的只是把计数也挂上去。观测面跟着一起按会话记,`调用 = 0` 该读成"真没用"还是"遥测没接上"也随之变准。
359
- - **场景描述上限 60 → 300 字**,并删掉「最多 60 字;超出部分在卡片上省略。」:卡片那一行靠 CSS 省略号截,再长也只占一行、撑不高卡片 —— 60 卡的是"能存多少",给的理由说的却是"显示多少",因果对不上。
360
- - **四个注入上限重新校准**:记忆段 256 KiB → **128 KiB**;技能 / 子智能体 / MCP 三条目录 60 → **50**;MCP 备注 200 → **300** 字。目录对齐在 50 条,横向看体积才有可比性。提示词域未动(64 KiB)。
361
- - **五张手写门禁清单合成一份 op 登记表**:`WRITE_OPS` / `SENSITIVE_OPS` / 场景冻结 / 档案同步 / 锁定注解各自抄一份 op 名字,中间**没有任何约束** —— 这条纪律历史上失守过四次,而失守的症状从来不是报错,是"没配令牌也能写"或"锁定的场景能被改"。现在 114 个 op 每一个在 `src/op-registry.ts` 登记一条判据,五张清单由它派生;**派生结果与重构前逐条相同**(36 / 2 / 51 / 9 / 5 / 2 / 1,一条不差)。启动时再拿真实 op 表反向对账四个方向,对不上就在兼容页挂一条降级。
362
- - **注入实况顶部多了成本一行**:「累计约 X · 最费某域 · 重发最多某域」。用"当前正文 × 该域投递次数"估,中途改过内容的话历史那几次不算现在的体积,所以带"约"。纯汇总,不动任何发送文本。
363
- - **`memory_manager_write` 的描述写清"什么不该记"**:能从代码 / 配置 / git 重新推导的一律不写、建前先查重。execute 里做一次名字与描述的相似比对,命中就在回执后附一行 —— **只说不拦**,猜错一次就把该记的东西记不下去,比多记一条代价大。
364
- - **`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 工具),我们的工具留着 —— 那正是它被造出来的场景;标准类预设下"读一个被你关掉的技能正文"这种管理动作由面板承担。
365
- - **`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"),够它认出这条是带人设的委派通道,但"没有人设贴合时才用官方那两个"没了。
366
-
367
- ### 修复
368
-
369
- - **自定义技能目录里的技能"列得出、调不动"**:技能页与官方目录都会把 `~/.dsh/skills-SuperWork`(及任何自定义目录)里的技能列给模型,模型照名字去调却拿到 `unknown or no longer available`。根因是 provider 内部两份清单:列表用 `userRoots() + customRootsFromState()`(全集),`getProviderSkill` 却只用 `rootByKey()` —— 后者只看五个静态根,自定义根住在状态文件里恒取不到,于是静默返回"没有这个技能"。补上按 `custom-<hash>` 解析那支。**已用真实数据核验**(修复后取回 6109 / 2260 字正文)。
370
- - **「采纳」不再把「已清空」通知当成正文**:那句提示写的是"调用发生时正文正在上下文里",代码算的却是"该域在这个会话里说过话" —— 域清空时发的那条通知同样带域标记。结果是**用户把某域关掉之后**模型凭工具描述去调它,照样记一次采纳,第三列其实一直是第二列的复本。建现场集合时按 `form` 挑掉通知条目,并显式移出"正是这一步被清空"的那些域(通知这会儿还没落到会话表面上)。仅遥测判定,不动发送文本与去重键。
371
- - **预览卡把"没在跑的服务器"报成「停用 N 个工具」**:进入场景的预览卡拿 MCP 停用表的**目标态**与现状逐台比对,而"场景里没勾这台 = 整台停用"在计划里就是一条 `服务器/*` —— 于是 6 台**从来没启用过**的服务器被列成「停用 6 个 MCP 工具:context7/*、fastgraph/* …」(用户实测截图)。服务器没在跑的时候,那张停用表只是记账:记成"整台停用"没有任何可见效果,把它读成"要停用它们的工具"是假话。现在工具级只报**前后都在跑**的服务器(逐工具开关真正起作用的情形),服务器级的改动仍由「停用 N 台服务器」那行如实说。
372
- - **README 关于子智能体工具那句是错的**:原文写 `_list` / `_run` "依赖宿主挂载 `dsh-subagent-*`,缺席时**不注册**(此时 13 个,界面不提示)"。读代码对不上 —— provider 缺席不影响注册,是 `ensureProvider` 在**调用那一刻**抛「子代理服务未挂载」;而真正的注册失败会逐个记下来,随子智能体页横幅与 `preset-tools` 的 `unavailable` **显示在界面上**。现在按实际写,并说明那四个管理侧工具与 provider 无关。
373
-
374
- ---
375
-
376
- ## [0.12.1] - 2026-09-22
377
-
378
- ### 修复
379
-
380
- - **子智能体页的人设名不再被挤成两三个字符**:以前名字和描述挤在同一横排里、右边还压着开关和两颗按钮,长名字显示成 `co...`。现在分成两行,名字独占一行、装不下才按省略号截断(悬停看全名)。
381
-
382
- ### 变更
383
-
384
- - **客户端类型检查进了门禁**:`typecheck:client` 此前没有任何地方调用,而且是红的。修掉那处错误后并入 `test` 与 `prepublishOnly`。
385
- - **四个注入上限抬高**:记忆段预算 64 KiB → **256 KiB**;技能目录 50 条 → **60 条**;子智能体 40 条 → **60 条**;MCP 50 条 → **60 条**。描述截断窗口不动(技能与子智能体仍 500 字、MCP 备注仍 200 字)—— 技能这项与官方 `dsh-tool-skill` 的默认值同源,抬成两套会让同一技能在不同预设下长度不一致。提示词域未动。
386
-
387
- ---
388
-
389
- ## [0.12.0] - 2026-09-20
390
-
391
- ### 新增
392
-
393
- - **兼容页「功能总览」**:一行一个功能点(十几项,第一行是「插件是否完整挂载」),状态由三层合成 —— 装配层(listener / provider / 适配是否真的挂上)+宿主能力层(探测结果)+你自己的配置(开关 / 令牌 / 场景锁定)。取值:正常 / 降级(附原因)/ 未启用 / 受令牌限制 / 部分生效 / 不可用。点一行跳到该功能所在的页签;数据全部来自已有缓存,不新增宿主探测。
394
- - **停用的 MCP 工具真的从模型可见的工具表里消失了**:`tools.restrict` 之前是在插件级上下文上调的,官方要求 agent scope、必抛 —— 异常被当成"registry race"吞掉,所以「停用」一直只有执行时拦截这一半。现在按 agent 逐个应用(跟随 agent 上线/下线),重新启用后工具会恢复可见。
395
- - **补丁写入前先做一次解析校验**:复刻官方解析补丁用的 YAML 方言(js-yaml + `!!js` 标签 + 官方那两条断言),写入前判一次产物。判据是**非对称**的 —— 只有"改前能解析、改后不能解析"(=我们的改动把产物弄坏了)才拒绝写入并保留原文件与备份;改前本来就解析不过(说明复刻过期)照写 + 上报;依赖不在也照写 + 上报。校验结论会出现在兼容页,写入回执也带一条 warning。
396
- - **doctor 新增三项检查**:① 插件运行时按裸模块名要的那几个宿主包(MCP 客户端 / 人设 / AGENTS.md 注入 / 技能目录)是否仍被宿主暴露;② 插件挂载心跳(`tool-management/mount.json`,含 12 个 inject 服务名)—— 官方改名任何一个 inject 服务名时插件根本不会 apply,且官方既不抛错也不打日志,这份心跳是那种情形下唯一的线索;③ 宿主版本与本插件验证过的版本不一致时显式提示。
397
- - **发行物的 `!!js` 表达式自带兜底**:双挂载判定那段表达式在**每次启动**被宿主求值,而那条调用链没有任何保护;现在表达式自己包了 try/catch,出错返回 false(=不参与判定、保持挂载),绝不把启动流程拖垮。
398
-
399
- ### 变更
400
-
401
- - **宿主补上原生删除入口时,先不切换**:单删与批删两条都改为"上报「宿主已提供原生入口」+ 继续走本插件自有完整序列(级联子会话 + spill + 记账 + 缓存行)"。切过去的代码今天不可达,写成即等于它会在官方补上入口的那次升级上首次运行、且无从事前验证。
402
- - **会话删除的前置检查补齐**:转录清理还要 `readSessionHeader` 与持久化后端的 `locate()`,而它们排在「装写屏障 → flush → detach → 清缓存行」之后 —— 缺任何一个,失败点都会落在中段(转录还在、记账已清)。现在这两项与已有检查一样,在任何破坏性步骤之前先确认。
403
- - **`@deepseek-ai/cordis` 的 peer 下界提到 `^4.0.2`**(对齐宿主实装);两个子智能体 spawn provider 进 devDependencies(运行时硬 require、此前在本仓库解析不到);移除没有引用的 devDependency `@deepseek-ai/dsh-user-approval`。
404
- - **依赖投递链写进文档**:`npm run build` 的镜像清单**不含 `node_modules`**,新增的运行时依赖(js-yaml)需要在 profile 侧安装;装不上时校验自动降级为「跳过 + 上报」。
405
-
406
- ### 修复
407
-
408
- - **关掉技能 / 提示词域后,官方那条注入真的停了**:此前拦不拦得住取决于启动时的注册先后 —— 没拦住的那次,官方内容照旧进上下文,界面上也看不出异常。现在位置固定,不再看运气。
409
- - **投影缓存删除屏障的三处缺陷**:① 第三方也包装同一份缓存时,旧屏障退役后仍留在登记表里、被下一次删除复用 → 墓碑拦截静默失效(缓存行可能复活);现在退役即摘出登记表,且复用前先验证包装器确实在岗。② 首次使用抛 `TypeError`(宿主形状变了)时不再把宿主留在"半个包装器"状态下 —— 恢复原方法并上报。③ 安装期(`requireTable()`)抛错时上报,不再只抛一句裸错。
410
- - **兼容页的删除动作可用性判定与服务端对齐**:此前客户端要求一个可选槽位(`projection.delete-native`),把本机可用的删除显示成不可用;同时服务端运行时真正要求的那条硬前提(投影缓存存储可删行)提升为能力表的正式条目 —— 界面说的和服务端做的从此同一份依据。
411
- - **兼容页的宿主身份锚点与 doctor 同一套策略**:此前运行时只按"插件自己解析到的包"上溯,dev 布局下会比出假的「同一份模块」,出现"界面说 ok、doctor 说 SEPARATE COPY"。
412
- - **工作区实体快照写不进去时不再静默**:写入后立刻读回,没写进去就上报(界面上的会话计数可能不刷新)。
413
- - **几处"只落 console"的装配失败现在出现在兼容页**:技能 provider 装配失败、上下文注入通道装配失败 —— 此前界面看起来一切正常。
414
- - **关域拦截有了顺序自检**:关域生效期间连续多轮一条都没拦到时会提示"可能没拦到(也可能是官方那几轮本来没内容)"。
415
-
416
- ---
417
-
418
- ## [0.11.0] - 2026-09-20
419
-
420
- ### 新增
421
-
422
- - **访问令牌可以设置、关闭、修改、删除了**:以前只有「设置」一条路,关掉就等于把配置里的令牌删掉、想再开只能重新输一遍。现在关闭只是"暂时不生效"(令牌留着,随时开回来),新增「修改令牌」与「删除令牌」,状态收成一枚四态胶囊 + 一句实况。
423
- - **批量启停可以撤销了**:MCP / 技能 / 记忆三处批量开关做完后出现一条不会自动消失的提示,点「撤销」按操作前的状态逐条写回。
424
- - **兼容页可以清理旧备份了**(页头「刷新」旁边):每份备份都是整份配置的副本、凭据在里面是明文,而自动剪枝只保证每层最多 5 份。逐层级选删除份数,弹窗内二次确认,只删备份、不碰当前配置。
425
- - **提示词页与子智能体页可以搜了**:按名称 / 描述过滤,无命中说「没有匹配的…」而不是「还没有…」。
426
- - **兼容体检改为真调一次**:归档 / 解档 / 批量 / 永久删除四个原生入口与会话的 detach / announce,以前只查方法名在不在就判可用;现在各用一个不可能命中的哨兵 id 真调一次,能调通才算数。
427
- - **令牌开启、本次启动还没解锁时,输入框会锁住**:对话走的是 DSH 自己的会话通路,不经过插件的 HTTP 门禁 —— 此前令牌配了没填照样能聊、五个域的注入照样进上下文。现在这种情况输入框直接锁住并说明去哪填,解锁后立刻恢复。
428
-
429
- ### 变更
430
-
431
- - **关闭 / 修改 / 删除令牌都要当场重输一次当前令牌**:解锁过**不算** —— 请求头里那份已验过的凭证对这三个销毁方向一律不作数,否则"能打开界面就能关掉保护 / 换掉凭证"。
432
- - **令牌面板拆成「访问令牌」与「令牌管理」两块,表单全部搬进弹窗**:前者只管本次启动 —— 一枚状态胶囊 + 解锁框,解锁错误直接顶替状态句显示;后者只管配置文件 —— 设置/修改、保护开关、删除、清除令牌四行静态清单,行名/说明/按钮同形同位。页面上不再有会展开收起的东西;成功 = 弹窗收起 + 状态行更新,失败 = 弹窗不关、错误显示在弹窗内;红色只出现在确认按钮上。
433
- - **「保护开关」的方向改按"令牌在不在生效"判断**:用环境变量提供令牌的用户以前会把"开着"显示成"开启保护"、找不到关闭入口;配置文件里没有令牌值时「删除令牌」也不再显示(点了是空操作)。「loader 行读不到」的提示也贴到操作区旁 —— 这一态下写配置必被宿主拒绝。
434
- - **同一类名字的判定口径统一了**:Windows 保留设备名与控制字符一律拒绝;场景名不再接受尾随空格或点(界面与宿主此前各有一套校验、已经分叉)。
435
- - **目录链接不再被跟随**:链接进来的记忆以前列得出来、开关也能开,却永远注入不进去。
436
- - **「打开源文件」限定在技能来源与人设目录内**:这个操作把路径交给系统编辑器,以前只校验后缀。
437
- - **六页搜索改为停手约 200ms 才过滤,列表只在数据或搜索词真变了才重算**:此前每敲一个字就把整份列表过滤排序一遍,而页面上任何一次重渲染(勾一次选、开个弹窗、MCP 每 5 秒轮询)都会再算一遍。
438
- - **会话批量删除不再逐条重扫全部会话**(原先 O(N × 全部会话),现在这批共用开头取的一次快照);注入通道与记忆列表也不再反复重读同一份索引(按文件 `mtime+size` 指纹缓存,外部改了下一轮照常生效)。
439
- - **导出加了病态上限**:单文件 32 MB / 合计 256 MB,超了明确报错(不再把"全部正文 + 一份 zip"同时堆在内存里);注定超限的上传在开始读之前就拒掉。
440
- - **没配访问令牌时,查看明文密钥不再要求令牌**:原先一律拒绝,而那时用户根本没有可填的令牌 —— 点「显示密钥」只有一句"缺少访问令牌",是条死路。有令牌(含"关掉保护")时照旧要带对的。
441
- - **「注入」设置块不再因为没填令牌而整块消失**:`inject-settings` / `mcpm-settings` 这两个"读改写"op 的**读**不再按写操作门禁(写仍然要令牌)。
442
-
443
- ### 修复
444
-
445
- - **打码的密钥不再被「保存」写坏**:编辑弹窗预填的是打码值,以前保存会把它当真值写回补丁文件,真密钥永久丢失。现在保存时用原值顶替、没有原值就跳过并提示。
446
- - **宿主没配令牌但浏览器里残留旧令牌时,现在有「清除令牌」入口**:以前那一态整行不渲染,残留令牌没有任何出口。
447
- - **别处触发"去填令牌"时,先收起弹窗再聚焦解锁框**:解锁框在弹窗展开期间是禁用的,直接聚焦会被浏览器吞掉。
448
- - **「令牌未验证」横幅不再盖住宿主的设置窗口**:层级降到插件弹窗之下,并加了关闭键;关掉后本次锁态期间不再出现,解锁后再锁照常回来。
449
- - **堵上「清除令牌后仍可对话」的漏洞**:解锁一次后「清除令牌 + 强刷新」,浏览器里已无令牌、对话却畅通 —— pre-step 门禁读的那颗"本次启动已验过"的闩只置位不清零。现在清除令牌会让宿主把闩重新挂上(`token-unaccept`,不进 handlers、模型碰不到;不要求凭证 —— 它只会收紧),必须重新验令牌才能对话;其它标签页内存里的旧令牌同步作废。
450
- - **编辑 MCP 服务器不再把 URL 里的凭据写成占位串**:URL 查询串是另一种打码形态(`?<redacted>`),现在与 env / headers 同一条规则 —— 没有原值可顶替时拒绝整次保存并提示重填。
451
- - **「设置宿主令牌」不再可能把 DSH 写坏到起不来**:`config:` 形状识别不了时会插入重复键,而官方解析器对重复键是抛错;现在识别不了就拒绝改写并说明。
452
- - **记忆索引损坏不再静默清空配置**:以前解析失败被当成"没有索引",下一次写入就把空索引落盘,一次损坏丢掉全部启用集合与排序。现在坏文件留存、拒绝写入并说明怎么办。
453
- - **开关状态不再莫名回弹或陈旧**:两个开关同时写同一份状态文件会互相抹掉;现在写操作串行执行,并跟随文件的实际改动。
454
- - **锁定场景正在生效时,不再能通过清空启用集合绕开模型侧的写门禁**。
455
- - **MCP「重启」中断后不再把服务器留在停用态**(恢复写在 `finally` 里)。
456
- - **导入文件不再让设置面板变空白**:渲染期抛错把整棵组件树卸载了。
457
- - **详情弹窗不再被"晚到的响应"搅乱**:连点两条时先发的响应后到会覆盖详情,关窗后晚到的响应还会把它重新打开。
458
- - **「显示密钥」真的能显示明文了**:以前客户端又打了一次码,解锁后看到的仍是 `sk-1****`。
459
- - **「令牌没过」的提示统一成一句话**,不再几秒后自己消失,且在任何弹窗里都看得见(此前弹窗里有的什么都不显示、有的没有跳转按钮)。
460
- - **子代理工具注册失败不再静默**:子智能体页顶部会出黄条说清是哪几个工具、为什么。
461
- - **读不到的记忆不再"人间蒸发"**:文件被删 / 权限不足 / 被锁时会连名字与原因出现在记忆页的告警条里。
462
- - **导出会话不再静默覆盖同名文件**(文件名带短哈希区分,撞名如实报 skipped)。
463
- - **命令行体检(`node scripts/doctor.mjs`)补齐 6 项能力**:删除 / 归档 / 列表路由真正依赖的那些以前不在体检范围,现在 15 项全列。
464
- - **键盘可达**:导入拖拽区以前是 `div` + `onClick`(Tab 到不了、回车也打不开),现在是真的按钮;工具页签补上页签语义与 ←/→/Home/End 切换。
465
- - **开了系统的「减少动态效果」后**,开关、拖拽区、注入预算条不再有过渡动画。
466
- - **批量归档部分失败会在结果里说明**;**人设改名改为原子写入**;**新建 / 导入记忆改为先落索引、再落文件**。
467
- - **技能 / 子智能体 / 记忆三页现在会显示场景与锁定横幅了**:服务端标了、界面读不到(技能页的字段被响应信封挡掉、子智能体页刷新时漏搬、记忆页压根没渲染)。记忆页的写控件在场景锁定时也因此**从未被禁用**过,一并修好。
468
- - **场景锁定期间不再显示「改动会同步写进场景档案」那条长提示**:开关都是灰的,那句话没有落点,与锁定横幅并排还互相矛盾。
469
- - **批量启停的撤销条改成琥珀色**(边框 + 提示句 + 淡底):它是这次批量操作唯一的补救通道,此前与旁边的普通回执长得一样,扫一眼不会注意到。
470
-
471
- ### 文档
472
-
473
- - **README 补上此前缺失的边界告知**:场景锁定的具体冻结范围、会话永久删除不进回收站、导出是可读转录不是完整备份、白名单会并回全部 MCP 工具、密钥在磁盘上始终是明文。
474
-
475
- ---
476
-
477
- ## [0.10.0] - 2026-09-18
478
-
479
- ### 新增
480
-
481
- - **「注入实况」显示每个域的采纳统计**:「注入 N 次 · 调用 M 次 · 采纳 K 次」,勾了开关但模型从没伸手一眼可见;节头并标注本进程观测到的工具调用数,区分「模型没用」与「统计没接上」。
482
- - **人设可配「目录注入」(`catalogDepth`)**:控制常驻人设目录注入到哪一层会话(默认只在顶层),不限制子代理继续嵌套。
483
- - **人设子代理支持 `inherit`**:继承本次会话**已完成**的轮次(本轮内委派仍要写全任务);贴合人设的任务从此一律走 `subagent_manager_run`,官方 `subagent` / `subagent_fork` 只在没人设贴合或需要后台任务时用。
484
- - **人设新增「输出要求」字段(`output:`)**:一行一条硬要求,单独成节写进子代理系统提示词,并约束父代理的 `task` 只给目标与上下文、不规定做法。
485
-
486
- ### 变更
487
-
488
- - **注入框架重排为 markdown 四级结构**:`##` 标题 + 加粗动作句前置 + 补充动作行 + 取代声明,五域同一副骨架;场景记忆与子智能体引导语同步重写(给判据、给优先级、补触发条件),正文重复标题与「已清空」通知的插件前缀一并去掉。
489
- - **提示词注入不再「裸送」**:与其余四域同款框架且整条包进 `<system-reminder>`(正文里的闭合标记会转义),界面显示来源文件与载入状态,模型侧正文带「来源:」行。
490
- - **关掉「技能」或「提示词」的勾选,官方那条注入一起停**(此前只停本插件自己);其余三域勾选完全生效。
491
- - **子代理会话不再注入场景记忆**(只在顶层注入),子代理上下文收敛为「角色 + 任务」,需要时用 `memory_manager_*` 自取。
492
- - **人设进子代理系统提示词时带角色框**:`# 角色:名` 标题 + 授权/边界一行 + `## 角色定义` 围栏,不含 `description`,人设文件本身不用改。
493
- - **MCP 列表改为全局在前、同级按名排序**,页面、场景档案勾选器与模型侧清单三处同序。
494
- - **人设目录的注入判据定为「深度 < `catalogDepth`」**;「注入实况」两档状态改称「已注入 / 不在本会话注入」,无正文行不再画展开箭头。
495
- - **五个管理工具的描述回指上下文里的注入块**,目录与工具互相指路。
496
- - **全部服务端错误码补齐双语词条**(此前 15 码无词条,英文界面回退中文原文);目录选择器与技能详情 frontmatter 标签同样改走词典。
497
- - **README 安全段补充**:栅栏降级面、`dir-list` 暴露面、HTTP 状态码以 `body.ok` 为准、裸 API 退出场景不清启用集。
498
- - **文档更正**:人设「默认停用」(此前写成自动启用)、场景接管期间「应用 = 改绑该场景」(此前写会被拒绝)、「四域开关同步档案」更正为三域(并更正 0.9.1 条目同句)、密钥打码字形改为与实现一致。
499
- - **六个管理页的启用项排到列表前面**:MCP / 技能 / 子智能体 / 提示词 / 记忆 / 场景,开着的浮在上面、停用后落回原位(两半内部保持原顺序,不是按名重排;提示词页没有开关,按「生效中」排)。拨开关引起的换位有 180ms 过渡,搜索 / 筛选 / 折叠与轮询刷新引起的位移不做动画,「减少动态效果」下直接落位。
500
-
501
- ### 修复
502
-
503
- - **兼容页的「访问令牌」块重排**(用户裁定 2026-09-18):块挪到「注入」**上面**(令牌不过时写操作全被拒,是"先解决才能用别的"的一件事);状态胶囊只放**短状态**(未配置 / 未填写 / 已匹配 / 不匹配)——上一版把整句"与宿主配置的令牌不一致……"塞进胶囊,一行里两种字号交错,是这块"很杂乱很丑"的主因;次要操作改成一行 quiet 文本按钮(与 MCP 页那排「详情 / 编辑 / 重启」同款,三个带边框的按钮挤在一起边框互相打断是另一半原因);说明从一整段散文改成**三条短句**(用户原话:写简单简洁一点,用户大致了解就行),版式与「工具能用 ≠ 模型知道」那份清单一致。
504
- - **「令牌没过」的提示统一成一套文案,并带跳转按钮**(用户裁定 2026-09-18):此前同一件事有四种说法(宿主写门禁、明文门禁两条分支、界面错误码词典各写一套,截图里能同时看到三种),用户无法判断是不是同一件事。现在宿主侧只有 `http-fence.ts` 里的 `TOKEN_MSG_NO_HOST` / `TOKEN_MSG_BAD` 两句(`TOKEN_PANEL_HINT` 拼进去,保证每个出口都指路),界面词典与它们逐字相同;识别按**文本相等**而不是猜关键词("缺少/未配置"这类词出现在别的提示里会误挂按钮)。按钮挂在共享的 `Notice` 组件里一处实现,于是**任意页面**的令牌提示右侧都会出现「填写令牌」——点了切到兼容页并把光标放进输入框(`ToolsSection` 注册切页签、兼容页消费聚焦请求,两条通路都覆盖:已在兼容页 / 刚切过去)。`apply` **之外**的 CompatPage 用不了 `Notice`,按本页写法手工拼同一套。另加一条契约测试钉住"宿主常量与界面词典逐字相同"——不同则按钮静默消失、同一件事又变两种说法。
505
- - **MCP 详情弹窗里也能看到「显示密钥」被拒的提示**(用户指出):用户是在弹窗里点的按钮,而提示此前只长在弹窗背后 —— 弹窗盖着它,等于没有提示。现在同一份提示面板在页面与弹窗里各渲染一份(`tokenGatePanel()`),弹窗里就贴在「显示密钥」那一节下面。
506
- - **作用域护栏补上"暂时性死区"这一类**(`test/client-scope.test.mjs`):`detailNode` 里调了写在它下方的 `const tokenGatePanel` —— 首屏不打开弹窗时那条引用不求值,测试全绿,一点「详情」就白屏(本次差点翻车)。判据扩成两条:跨 `apply` 作用域的**组件引用**、以及同函数内**先用后声明 const**(两种引用形态:组件首参与被调函数)。已用真实代码回退验证过判据抓得到(`L2408 用了 tokenGatePanel,但它的声明在 L2430`)。
507
- - **访问令牌的控制面挪进面板,且只对本次运行有效**(用户裁定 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 才生效,界面用「本次填写 = 已匹配」与「待重启」两处状态如实说清,而不是让人以为点了没反应。
508
- - **新增静态护栏:`apply` 外面的组件不许引用 `apply` 里面的组件**(`test/client-scope.test.mjs`):这类引用只在 state 有值时才求值 —— 首屏正常、一交互就白屏,且不留任何日志(客户端错误不进宿主日志)。本次「兼容页访问令牌」的第一版正是这么翻的(`CompatPage` 声明在 `apply` 之外,却用了 `apply` 内的 `Notice`,填完令牌点保存即白屏)。判据只查 `createElement(名)` / `h(名)` 的首参,所以不误报:一般化的跨作用域检查会被同名局部变量与参数遮蔽,实测在本文件上能报出 30+ 条假阳性。护栏附一条自检用例,拿一段必然违规的代码喂给同一个判据,避免"没报错"其实等于"没在跑"。
509
- - **访问令牌有了与页面无关的固定入口**(兼容页「访问令牌」块,用户裁定):此前输入框只长在 MCP 页的服务详情弹窗里,而「缺少或错误的访问令牌」这条错误会出现在**任意**页面 —— 在场景页被拒的用户找不到任何地方能填(实测死路)。现在兼容页显示两枚状态(宿主配置有没有 / 本机浏览器这串对不对)、能填能清,错误文案也直接指向那里;宿主侧新增只读的 `token-status`(只回答"配没配 / 这次带的对不对",**不回令牌本身**),写操作被拒时回 `code: error.token.required`。
510
- - **打码密钥不再被写回补丁文件**(真实事故):编辑弹窗的密钥框预填的是**打码值**(列表本来就把它打码了),而写入路径原样接受表单内容 —— 于是「打开编辑 → 改个别的字段 → 保存」就把真密钥覆盖成了 `••••••`,且无法找回(本机 `TAVILY_API_KEY` 即如此丢失)。现在保存前按 `src/mcp/secret-guard.ts` 收敛:有原值就用原值顶替(= 这一项没改),没有原值或原值本身已是打码值时**跳过该键**并回一条提示;新增与 JSON 导入走同一套。出口另加结构性断言(`buildInsertBlock`),任何漏过守卫的调用点直接拒绝写入,而不是写一个假值进去。
511
- - **补丁文件里已存在的打码密钥会被主动报出来**:MCP 列表把它列进告警(`服务器名.键名`),说明真值已丢失、要重新填写 —— 此前这种状态完全隐形,用户只会在下次保存时再撞一次同一个结果。
512
- - **「显示密钥」解锁后能看到明文了**:客户端此前在详情面板又打了一次码(保留前 4 个字符 + `****`),导致配好访问令牌、`mcpm-reveal` 返回真值之后,界面上显示的仍是 `sk-1****`;同时打码字形与宿主不一致,详情里会出现 `••••****` 这种双重打码。现在打码的**唯一出处是宿主**,客户端不再加工。
513
- - **编辑弹窗会说明密钥框里是打码值**:明确「直接保存不会改动它们」「要看原文需要点『显示密钥』并填对访问令牌」,避免用户以为真密钥长这样、或者以为保存会改掉它。
514
- - **场景锁定补齐模型侧**:`mcp_manager_add` / `skill_manager_create` / `memory_manager_write` / `prompt_manager_apply` 四个工具此前绕过守卫,锁定期间仍可调用。
515
- - **记忆怎么删都进回收站**:形态转换与改名此前直接删旧文件(bundle 连附件一起),现在先入回收站再删。
516
- - **`mcpm-tools-refresh` 要求令牌**:它会临时启停服务器并写两次补丁,此前漏在写操作门清单外。
517
- - **子代理结果不再混入思考块**;「没有正文」按收尾原因分档说明,不再一律报「无输出」。
518
- - **人设正文与名字里的 `{{…}}` 不再让子代理启动失败**。
519
- - **子会话里调委派工具不再被本插件拦下**(不再向官方传 `maxDepth`,人设列表也不再按深度过滤)。
520
- - **MCP 状态不再把「连不上」报成「可用」**:可用性只认当前真实注册的工具数;曾连上、当前不可用的如实标注。
521
- - **场景里手动关掉的技能目录 / MCP 服务器,退出场景后正常还原**(快照全量记录进场景前状态)。
522
- - **覆盖导入失败自动回滚**;编辑 MCP 服务器保留手写的 `toolCallTimeoutMs`;整台停用时「上次运行时」工具行不再标「已启用」。
523
- - **场景进行中改 MCP serverName 或人设名,退出场景恢复正常还原**;重启等待窗口内的并发启用不再被快照覆盖。
524
- - **记忆描述含独立 `---` 行不再截断**(此类多行描述改用引号标量序列化)。
525
- - **提示词页「应用」失败现在会显示错误**;手工编辑 memories-index.json 的场景描述会触发注入重算。
526
- - **兼容页「注入实况」的说明不再截断、节头不再错位**;技能页页头按钮窄栏自动收档,「全选」不再折行。
527
- - **访问令牌比较改为常量时间**(双侧 sha256 + timingSafeEqual)。
528
- - **测试与开发工具**:补 parseModeState 透传契约断言;client-render 夹具对齐现行响应形状;check-i18n 修复行首键漏对账;`preview-memory-note` / `preview-compat` 修到可跑。
529
-
530
- ### 移除
531
-
532
- - `./projcache` 子路径导出与 `lib/history/projcache.js`(archive-manager 时代的投影缓存替换实现,与现行「不插入竞争 provider」的架构冲突,仓库与文档均无引用)。若某个 profile 曾用 `dsh-plugin-tool-management/projcache` 挂载过它,删掉那一行。
533
-
534
- ---
535
-
536
- ## [0.9.1] - 2026-09-17
537
-
538
- ### 新增
539
-
540
- - **兼容页「注入实况」**:显示最近活跃会话里模型**实际看到**的五域文本,并如实分清「在上下文中 / 未投递 / 官方注入 / 已关闭」——勾了开关却没送到时一眼可见。
541
- - **「全选」统一成「全选 ↔ 取消全选」二合一**(不再并列两个按钮),并给技能管理页、记忆管理页、记忆的每个场景卡片补上缺的批量开关。
542
- - **场景未锁定时页面开关照常可用**,改动会同步写进当前场景的档案(MCP / 技能 / 子智能体 / 提示词**三域**的开关同步进档案 —— 记忆域的开关是单一真相源,不经过档案;锁定才冻结)。
543
- - **人设也严格「退出即还原」**:快照记下进场景时全部人设的开与关,退出逐个恢复。
544
- - **技能管理页每个来源(目录)卡片也能批量开关**,点它或点来源开关会顺带把卡片展开。
545
- - **bundle 记忆在列表里显示附件数量**:多一颗「N 个附件」标签(0 个也显示,灰色),悬停给出总量与文件名,点它打开编辑弹窗并跳到附件区。
546
-
547
- ### 变更
548
-
549
- - MCP 页的「全部启用 / 全部停用」移到页头动作栏,会话页的「全选」移到「导出会话」旁。
550
- - 场景横幅与提示词接管提示改口:从「开关已停用、请到档案编辑器里改」改成「改动会同步写进该场景的档案」。
551
- - 技能目录卡片的「移除来源」改为纯图标按钮(悬停说明后果,点击仍弹确认框)。
552
-
553
- ### 修复
554
-
555
- - **退出模式失败、卡在场景里**:项目级技能来源在恢复时解析不到就中断整个退出,现在按 key 前缀解析,且逐行容错、不再因为一行把人困住。
556
- - **场景内打开技能,档案不跟着变**:同步逻辑读错了开关字段,「打开」被当成「关闭」而跳过写盘;现在按操作名判方向,档案没写成时页面也不再只报「已更新」。
557
- - **被同名技能覆盖的副本、结构不完整的技能不再进场景档案**:前者档案与运行时各说各话,后者曾让整个场景进不去。
558
- - **场景档案的 MCP / 技能 / 子智能体段全勾满仍显示「全选」**(没有「取消全选」态);并列的「全选 + 清空」收敛成一个按钮。
559
- - **按钮文案一变就把整行挤走**:「全选 / 取消全选」与「刷新 / 刷新中…」的宽度改为按较宽的那份固定,八个管理页一致。
560
- - **点刷新没有「刷新中…」**:MCP / 提示词 / 会话三页的刷新从不立起加载标记,现在手动刷新会真的切过去(后台轮询不算),会话页并补上缺失的失败分支。
561
- - **MCP 工具描述的「展开」按钮**:改为按真实溢出显示,真被裁到两行才给按钮。
562
- - **flat 记忆的描述与「已启用」之间空出一段**:窄布局下空标签行不再占位置。
563
-
564
- ---
565
-
566
- ## [0.9.0] - 2026-09-16
567
-
568
- ### 新增
569
-
570
- - **五个域各有自己的上下文注入**(用户裁定):场景和记忆 / MCP / 技能 / 子智能体 / 提示词各发一条消息、轨迹里各占一行;只改一个域只重发那一条,域被关掉或清空时单独发一条「已清空」。
571
- - **提示词与技能目录两个新域**:官方那两条行挂得到就让官方送(标准等),挂不到(极简)才由插件兜底,不会出现两份;场景提示词与 `~/.dsh/AGENTS.md` 在官方语义里是同一件事,合并为一个「提示词」域。
572
- - **兼容页「注入」块**:总开关「极简模式也注入」+ 五个域勾选,设置存 `tool-management/inject-settings.json`。
573
- - **模型侧信息补全**:技能同名标出 `shadowed by <root>`(被覆盖)与 `preferred`(首选),启用被覆盖的副本不再回 OK 而无效;`skill_manager_list` / `prompt_manager_list` 给出源文件路径;MCP 备注进 `mcp_manager_list` 输出(字段 `user-hint`);未运行的服务器也显示工具描述(按「上次运行时」缓存),超两行默认折叠。
574
- - **AGENTS.md 预设库记住「最近一次应用」**:手改过全局文件也能答出「来自预设 X(此后文件有变)」,不再退化成全列。
575
- - **`npm run sync:profile`**:把构建产物镜像进 DSH profile——profile 里是硬链接拷贝,构建新增的文件不会自动过去。
576
-
577
- ### 变更
578
-
579
- - **注入不再依赖系统提示词段**(用户裁定):四个域从 `systemPrompt.section()` 改走官方自己用的那条通道(`agent/pre-step` 合成消息)——persona `complete` 的预设(极简)再也压不掉;内容没变不重发,引导语压成一句。
580
- - **域名与顺序**:`记忆` → **场景和记忆**、`全局提示词` → **提示词**;从左到右 **场景和记忆 → MCP → 技能 → 子智能体 → 提示词**(注入块、可达矩阵、注入消息三处一致)。
581
- - **兼容页「预设注入边界」与页脚重写**:页脚区分「可调用 ≠ 已知晓」——工具任何预设下都可调用,但呈现由预设决定(`ptc` 会把工具编成生成 SDK,要在 `run_code` 里调)。
582
- - **破坏性**:四个工具族改名——`agentsmd_*` → `prompt_manager_*`、`rule_manager_*` → `memory_manager_*`、`skill_mcp_manager_*` → `mcp_manager_*`、`subagent_list/run` → `subagent_manager_list/run`;提示词或工作流里点名过旧名的一起改。
583
- - **插件文件全部收进 `tool-management/` 并按域改名**(`agents-md/` → `prompts/`、`agents/` → `subagents/`、`rules-index.json` → `memories-index.json`、`state.json` → `skills-state.json` 等),启动时自动迁移(只搬不删、绝不覆盖)。
584
- - **四个列表工具默认只列生效条目**(各带 `all=true` 看全量,表头给出全量口径);工具描述精简 37%。
585
- - **MCP 详情页运行状态改成标题右侧的彩色标签**;备注的模型侧前缀统一为「用户提示:」。
586
- - **场景记忆段排版重做**:场景上提到 `##`、条目挂在各自场景下;名称恒为标题、显式描述进括号;bundle 补一行附件目录与文件名;正文文件 `SKILL.md` → `<名>.md`(旧名只读兼容,不迁移)。
587
-
588
- ### 修复
589
-
590
- - **子智能体人设弹窗三个毛病一起修**:候选不自动拉、已启用模式的名单进不去、「关闭」后再「启动」清空勾选;现在自动展开也拉候选,**点行首即可展开 / 收起名单**,右侧按钮只管启用 / 停用,停用后再启用记得勾选。
591
- - **「预设注入边界」三处口径纠正**:子智能体列答「人设目录到不到得了模型」;技能 / 提示词列以官方为准(官方那条行挂着就是绿的);MCP 列按提示词平面作答(被压制即红框)。
592
- - **每个场景块恒有一行加粗的「场景说明:」**(未填描述给默认句)。
593
- - **场景内的开关统一收归档案**(四域同口径,模型工具同样拒绝);改档案立即生效、失败如实回报。
594
- - **人设域与 MCP / 技能进场景按档案勾选集全量对齐**(整段未定义 = 全部停用),退出按快照双向还原。
595
- - **场景接管提示词时四条状态共用一套事实**:只有场景绑定的那份可「重新应用」;删除保护扩成引用清单;文件被手改时两页都标出「文件里不是它」。
596
- - **场景退出后 MCP 行「开关已关、进程已停、却仍显示已运行」**:补丁说停用即不可能在运行,显示跟着控制面走。
597
- - **「N 个工具」不再把停用工具算进去**(有停用时显示 `可用/总数`);工具全被停用的服务器不进段。
598
- - **场景名与记忆名相同会「吃掉」整个场景**:统一为「根下的一级目录恒为场景」(发现 / 定位 / 导入三处)。
599
- - **进场景被关掉的人设,退出没开回来**:快照名单落盘读回时被剥掉,现在原样透传。
600
- - **未启用的场景不再整片标红**:记忆页里「场景未启用」此前与真问题(游离记忆、被同名覆盖)共用同一个错误色,整块红读起来像出了错;现在未启用 = 灰色置灰(标签同色),红色只留给真问题——场景页与档案编辑器里的「未启用」标签同步改灰。
601
- - **小项**:注入边界提示不再点名工具(此前让模型去用刚用过的工具);`skill_manager_list` 修影子技能误报停用;删 `subagent_manager_list` 空参数 `scene`、修 `create_skill` 老文案。
602
-
603
- ---
604
-
605
- ## [0.8.5] - 2026-09-16
606
-
607
- ### 新增
608
-
609
- - 场景级 MCP 服务器备注:场景档案的 MCP 段可为每台勾选的服务器写专属备注,进入该场景时覆盖全局备注(写入 notes.json),退出场景时按快照恢复改动前的备注;未配场景备注的服务器照常使用全局备注。
610
- - 未运行服务器的工具可见性:新增「已知工具」侧车(`dsh-plugin-tool-management-mcp-tools.json`),枚举到 live 工具时按服务器记下名单——未运行的服务器不再永远显示 0 工具,工具勾选框也能列出最后一次见过的工具。从未运行过的服务器可在编辑弹窗点「启动服务器读取工具」:临时启用、轮询等工具注册(≤30s)、记入名单后恢复原启停状态。
611
-
612
- ### 变更
613
-
614
- - 新增技能 / 子智能体 / MCP 一律默认不启动(用户裁定,三域同口径):新建与导入的技能显式写入停用名单;新建/导入/回收站恢复的人设默认停用;新增 MCP 服务器创建即停用(显式传 `enabled: true` 才创建即启动)。启动与否由用户手动开启。
615
- - 场景档案 MCP「编辑」弹窗重做:行内备注输入框移除,「选工具」改为「编辑」,点击打开固定尺寸次级弹窗——第一栏备注、第二栏工具勾选(含全选/清空),有备注的服务器行显示「有备注」标签。
616
- - 系统提示词注入段文案优化:子智能体人设段措辞改为「可从下面的人设中选用」(此前读起来像"只能调用这几个"),并补充委派机制说明;场景记忆段标题下加固定引导语,让模型明确这是当前场景的常驻参考知识;MCP 备注前缀由「用户备注:」统一为「备注:」。
617
- - peer 依赖去掉 semver 上界(`>=0.1.5-rc.2 <0.2.0-0` → `>=0.1.5-rc.2`):宿主跨 minor 升级不再被 pnpm peer 校验挡住安装,兼容性改由运行时能力探测兜底。
618
-
619
- ### 修复
620
-
621
- - 历史页「已移除」标签红灰两色统一为灰色:此前红色 = 从未登记、灰色 = 曾登记被移除,颜色区分无实际意义。
622
- - 目录真实存在但没有「重新登记」按钮:`canRegister` 判定从「宿主会话索引命中」放宽为「磁盘目录真实存在」(带 stat 缓存,同一目录只探一次盘),与 `registerWorkspace` 的 realpath 目录校验一致——目录在即可一键重新登记;目录已删除的组显示「⚠ 目录已不存在」提示。
623
- - MCP 状态段缓存不刷新:MCP 工具加载完成(`tools/change`)与进/退/切换场景后均主动重算状态段——此前段停留在「空/旧集合」的缓存值,出现「切换 MCP 后系统提示词没有 MCP 段」「退出场景后备注看似没恢复」的现象。
624
- - 退出场景备注永不回退:rules-index.json 读盘时的快照规范化按白名单解析,漏掉了 `snapshot.mcpNotes`——进入时拍下的恢复名单一读回来就被剥掉,退出模式拿不到名单、备注永远停在场景值。现已透传该字段(并补进入覆盖/退出恢复/未勾选不触碰三条直证回归测试;未勾选服务器的场景备注不再在进入时覆盖其全局备注)。
625
-
626
- ### 说明
627
-
628
- - 人设"文件缺失 = 全部启用"的老数据兼容语义保留:只有首次新建/导入/恢复时物化现状并排除新名;已有技能与人设的启用状态不动。
629
-
630
- ---
631
-
632
- ## [0.8.0] - 2026-09-15
633
-
634
- ### 新增
635
-
636
- - 场景锁定:锁定后 MCP / 技能 / 子智能体 / 记忆 / 提示词五个域整体只读;未启动不能上锁,锁定中不能关闭或切换,先解锁再改。
637
- - 子智能体开关:停用的人设不注入上下文、模型不可见(文件不动);新建 / 导入 / 回收站恢复的人设自动启用,首次升级全部启用。
638
- - 场景联动:启动场景时档案勾选的子智能体自动启用,退出按快照精确停回。
639
- - 子智能体人设目录进入系统提示词:只列名字 + 描述,正文仅在委派时传给子代理。
640
- - MCP 服务器状态与用户备注进入系统提示词:只列当前真正可用的 server,备注作为决策提示带给模型。
641
- - 四个管理域补上导出(技能 / 子智能体 / 提示词 / 记忆):勾选条目打包 zip 写到指定目录,只读源文件。
642
- - 提示词预设支持描述:只显示在插件界面,不写进 AGENTS.md。
643
-
644
- ### 变更
645
-
646
- - 导出弹窗重做:固定宽高、默认不勾选、条目分组折叠(技能按来源文件夹、记忆按场景、会话按工作区目录),组内同名条目全部展示。
647
- - 导入入口统一:提示词补上与技能页同源的导入弹窗;四个导入弹窗一律用「文件要求」清单。
648
- - 删除场景不再要求先清空:连它下面的全部记忆一起进同一条回收站条目,恢复按原路径整条放回;使用中的场景仍拒绝删除。
649
- - 场景名与人设名可以改了:改名连带目录与档案绑定同步;保留场景、重名、正在使用的场景明确拒绝。
650
- - 场景开关成为唯一入口:打开 = 进入场景(应用档案 + 启用),关闭 = 恢复全局默认;「退出模式」与开关走同一条路径。
651
- - 记忆改为单一真相源 `enabled`:档案弹窗的勾选就是记忆自身的开关;新建与导入的记忆默认不开启。
652
- - 提示词「应用」生效时机口径修正:下一轮对话即生效(宿主每轮重读 AGENTS.md),不再说「新会话生效」。
653
- - 技能回收站弹窗重做:上下两块(目录 / 技能)各占一半、各自滚动,两组的后果差异写进界面;入口移到工具栏。
654
- - MCP 新增默认级别改为全局;「Profile 级」更名「应用级」,级别下拉全局在上。
655
- - 界面统一化:按钮四级语义、列表类弹窗固定尺寸且只允许列表层滚动、工具栏顺序固定、命名统一「新增 / 导入 / 导出 + 页名」;提示词 / 子智能体页补统计行。
656
- - 备注输入框加 200 字上限,备注标签如实说明(会随请求发送给模型)。
657
-
658
- ### 修复
659
-
660
- - 进 / 退模式报 EPERM 且开关要点两次:索引与技能管理状态的原子写遇文件占用(EPERM/EACCES/EBUSY)自动重试。
661
- - 退出场景模式后 MCP 服务器级与技能目录不回滚:快照的服务器级 / 来源级名单在读盘时被剥掉,现在原样保留。
662
- - 列表类弹窗条目多时看不到滚动条:列表组被 flex 收缩后条目直接被裁掉;现在列表层正常滚动并带常驻细滚动条。
663
- - 顶部「当前模式」横幅永远不显示:开关与按钮各写一个状态、互不同步,现在两者恒等。
664
- - 长文本排版错位与截断丢失:标题截断补齐并加 `title` 提示。
665
- - 历史页两个工作区分组标签区分无实际意义,统一为「已移除」。
666
- - 兼容页把 semver 上界当受支持版本展示。
667
- - 清理 CSS 死规则、未定义类名与 i18n 死键;滚动容器改为向上查找。
668
-
669
- ### 移除
670
-
671
- - 「切入此模式」按钮(开关承担)。
672
- - 场景档案的 `memories` 段:老档案里的该字段被忽略,不做自动迁移。
673
- - `memoryAllowed` / `computeMemoriesPlan`(单一真相源后不再需要)。
674
-
675
- ### 说明
676
-
677
- - 新建记忆默认不开启是行为变更:已有记忆的 `enabled` 原样保留,不受影响。
678
- - 老数据里 `mode.scene` 与 `active` 可能不一致:不做一次性迁移,下次拨动任一场景开关时自然对齐。
679
-
680
- ## [0.7.0] - 2026-09-15
681
-
682
- ### 新增
683
-
684
- - 回收站扩到子智能体 / 场景 / 提示词预设三处:删除都进回收站,可恢复或永久删除(恢复绝不覆盖)。
685
- - 子智能体工具限制改为按 Agent 预设:每个预设一份白/黑名单(互相排斥),运行期按当前预设生效。
686
- - 兼容页「预设注入边界」改版:五列标签(记忆 / 提示词 / 技能 / MCP / 子智能体),绿/红/灰框一眼看出哪个域被预设关掉。
687
-
688
- ### 变更
689
-
690
- - 已移除的来源并入回收站(分目录/技能两部分,目录支持永久删除)。
691
- - 五处回收站排版统一(固定高度容器、行内边距收紧)。
692
- - MCP「整理补丁」重新上线:删多余启停覆盖块(生效状态不变),界面只留一个按钮。
693
-
694
- ### 修复
695
-
696
- - 技能页「移除来源 / 恢复读取」死按钮:补客户端 op 映射 + 补进 writeOps 门禁清单。
697
- - `rules-toggle` 不传 `enabled` 时静默 no-op 却返回成功:改为缺参明确拒绝、不写盘。
698
- - 场景档案「技能集」把来源 key 当技能名显示:改为技能名与来源名分开回传,不再显示 `custom-<hash>`。
699
-
700
- ### 安全
701
-
702
- - 明文密钥改为一律要令牌:「显示密钥」与配置导出没配 `token` 时一律拒绝,不再只靠宿主栅栏。
703
-
704
- ---
705
-
706
- ## [0.6.0] - 2026-09-14
707
-
708
- ### 新增
709
-
710
- - 「工具 → 兼容」页(第 8 个页签,只读):宿主版本、能力可用数、每个动作走原生/适配/不可用、降级项与原因。
711
- - `node scripts/doctor.mjs`:命令行版兼容体检。
712
- - `node scripts/host-deps.mjs --fix/--restore`:把插件依赖 junction 到宿主安装。
713
- - 归档分组可重建:工作区登记被删后按会话目录自动重建,可一键重新登记。
714
- - 恢复归档顺带挂回工作区归属(此前会掉进「未分组」)。
715
- - 场景可绑定提示词预设;切换场景直接改写 `~/.dsh/AGENTS.md`(关掉自动恢复基线)。
716
- - 提示词预设库:新建即可写正文、编辑可改 id(= 目录改名,场景绑定自动跟着改)。
717
- - 正在生效的提示词预设不能删除。
718
- - 场景启用改单选(同时只启用一个,新场景默认不启动)。
719
-
720
- ### 变更
721
-
722
- - 兼容判定换底座:源码文本比对 → 模块实体 + 能力探测;拒绝永远在写入之前。
723
- - 技能来源权限语义修正:默认来源必须读取但技能可删;外部目录可停用/移除但技能只读。
724
- - 用户数据搬出插件目录(归档账本等移入 hub)。
725
- - 归档服务改为独立门面:`cordis.patch.yml` 只插入本插件。
726
- - 弹窗按钮统一(取消/关闭只在右上角)。
727
- - 面板语言跟随宿主;会话页与 AGENTS.md 页接入中英词典。
728
- - AGENTS.md 应用保留 5 代备份。
729
- - 提示词预设 id 口径放宽(中文、空格等可用)。
730
- - `history-retention-set` 拒绝小数;`rules-set-active` 必须显式传参;`mcpm-set-enabled` 停用幂等。
731
- - 写操作门禁:先过宿主栅栏,`token` 作为脚本/局域网逃生门。
732
-
733
- ### 修复
734
-
735
- - 进出场景模式会静默改写技能策略(数据污染):快照只取生效项,已处于目标状态的不再写。
736
- - 导入技能删进回收站拿不回来:按作用域分岔,用户级来源按 key 重新解析路径。
737
- - 技能回收站显示字面量 `undefined`。
738
- - 面板不随宿主语言切换、两页硬编码中文、词条键写错导致界面露原始键名。
739
- - `subagent_manager_run` 确认门早于参数校验:人设不存在时不再先弹卡。
740
- - 删除链路前置实现检查:在任何破坏性步骤之前校验所需方法。
741
- - 英文界面下兼容页结论条仍是中文:改为客户端按当前语言拼。
742
- - 两处过时文案(AGENTS.md 应用说明、创建技能确认卡落点)。
743
-
744
- ### 安全
745
-
746
- - `mcpm-reveal` / `mcpm-export` 额外要求带 `Origin` 头。
747
- - `history-workspace-register` 补入 WRITE_OPS(此前漏了 token 门禁)。
748
-
749
- ---
750
-
751
- ## [0.5.1] - 2026-09-13
752
-
753
- ### 新增
754
-
755
- - 场景档案弹窗新加段默认一项都不勾:记忆段只预勾本场景已启用的,其余三段是空集。
756
-
757
- ### 变更
758
-
759
- - 档案弹窗「记忆」段只列被编辑场景自己的记忆。
760
- - 场景页排版重做:卡片只留名字+描述+动作,数量收进页首「当前模式」条。
761
- - 保留场景「全局」不再出现在场景页与档案弹窗。
762
-
763
- ---
764
-
765
- ## [0.5.0] - 2026-09-13
766
-
767
- ### 新增
768
-
769
- - 插件自有技能来源「导入技能」(新建/导入落点,优先级高于 `~/.dsh/skills/`)。
770
- - 「移除来源」= 连目录都不再扫描(文件零改动,可恢复)。
771
- - 场景档案编辑器新增第 4 段「记忆」。
772
- - 人设模型与工具限制收进「高级选项」折叠区。
773
-
774
- ### 变更
775
-
776
- - **破坏性**:插件产生的文件全部收进 `~/.dsh/tool-management/`(旧位置自动搬入)。
777
- - 场景升级为显式记录(带描述与顺序);空场景合法;根层裸 `.md` 不再注入。
778
- - 斜杠命令全部下线。
779
-
780
- ### 修复
781
-
782
- - 工具页整页白屏(`sceneLabel` 闭包作用域错)。
783
- - 导出静默丢失(导出写在 `apply` 体内)。
784
- - Skills 页被锁死(状态文件缺键被判非法 → 改为缺键自愈)。
785
-
786
- ---
787
-
788
- ## [0.2.0] - 2026-09-12
789
-
790
- ### 新增
791
-
792
- - 五个域合并进一个「工具」设置面板:MCP / Skills / AGENTS.md 预设 / History。
793
- - MCP:工具级独立启停、重启只重连不改启停、密钥默认打码、改写补丁前自动 `.bak`(保留 5 份)。
794
- - Skills:接入 `~/.agents` / `~/.codex` / `~/.claude` 与自定义目录;创建 / ZIP 导入 / 回收站;目录后台监听自动刷新。
795
- - AGENTS.md 预设库:多套全局基线,一键应用。
796
- - History:归档会话按项目分组、批量恢复 / 删除、保留期清理;从 Claude Code / Cursor / Codex / 任意文本导入;导出 Markdown / JSONL。
797
-
798
- > 0.1.1 / 0.1.2 / 0.1.3 没有独立记录(只有 git tag),此处不拆分它们的差异。
1
+ # 变更日志
2
+
3
+ 本文件记录本项目的所有重要变更。
4
+
5
+ 格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循[语义化版本](https://semver.org/lang/zh-CN/)。
6
+
7
+ - 只想看「大致改了什么」→ [版本更新概要](docs/update.md)
8
+ - 功能说明与用法 → [README](README.md) / [README_EN](README_EN.md)
9
+ - 工程细节(根因分析、实测数据、设计取舍)在 git 历史里,不在这里。
10
+
11
+ ---
12
+
13
+ ## [0.20.0] -2026-10-12
14
+
15
+ 修好技能回收站「目录」块的批量永久删除;记忆回收站与其它回收站统一。回收站每条可点开「详情」只读预览内容,另有一批界面打磨;`scene_manager_save` 补齐模型工具表方案 / 快捷提示词 / MCP 备注三处绑定,`prompt_manager_apply` 可取消应用。
16
+
17
+ ### 新增
18
+
19
+ - **记忆回收站补上批量永久删除**:条目可勾选,「全选 / 取消全选」与「永久删除 (N)」同一行、就地二次确认。
20
+ - **回收站「详情」**:五类回收站的每条都能点开,只读预览删除的内容(文本、体积、超限截断标注),不能改、没有保存按钮。
21
+ - **MCP 导出可选目录**:导出弹窗可指定目录,并支持先预览再落盘。
22
+ - **`scene_manager_save` 可绑模型工具表方案与快捷提示词**:新添 `toolTablePreset`(省略 = 保持,`''` = 解绑,`factory-default` = 出厂默认)与 `quickPrompts`(省略 = 保持,`[]` = 进入后全部停用)两个参数;场景级 MCP 备注覆盖(`mcpNotes`)同轮补上。三栏界面早可配,模型侧此前只能看、不能写。
23
+ - **`scene_manager_list` 档案行显示快捷提示词绑定**:绑了几条、是不是「进入后全部停用」,与「工具表方案」同一口径。
24
+ - **`prompt_manager_apply` 支持取消应用**:传 `apply=false` 把 `AGENTS.md` 恢复到这一串应用开始之前的状态(那时没有文件就连文件删掉);场景正驱动基线时拒绝,出路与界面相同。
25
+
26
+ ### 修复
27
+
28
+ - **技能回收站「目录」块的批量永久删除整批失败**:报「已删除 0 条来源记录,N 条失败:unknown action」。逐条删除走的是宿主不存在的接口路径,与列表里那颗「永久删除」按钮用的不是同一个。
29
+ - **下拉菜单悬停没有高亮**:只有当前选中项有底色,鼠标移上去看不出停在哪一条。
30
+ - **横幅「填写令牌」只有下半截能点**:按钮被宿主标题栏的窗口拖拽区吃掉一截,现在整颗可点。
31
+ - **浅色主题下场景编辑器四个功能集没有分块**:与弹窗同色、融成一片白,补上描边。
32
+ - **容器边框深浅不一**:卡片外框统一一档,行内分隔线保持轻一档(配置表、技能数据元、正文框、MCP 工具卡等)。
33
+ - **技能来源「永久删除」后下一轮又回来**:改记一份彻底忘记的名单,磁盘文件不动;同名目录可重新添加。
34
+ - **`scene_manager_save` 的 `prompt: ''` 解绑不再静默失效**:空串解绑自此真正生效,回执与实际一致。
35
+
36
+ ### 变更
37
+
38
+ - **各页统计框汉字与数字统一为深灰 12px、正常字重**:场景 / MCP / 技能 / 子智能体 / 提示词 / 记忆 / 历史七页。
39
+ - **记忆回收站改用与其它回收站同一套弹窗**,标题也由「记忆回收站」改成「回收站」(入口那颗按钮本来就叫「回收站」)。
40
+ - **横幅那颗键「前往」改成「填写令牌」**:点了就地弹窗填令牌、填对自动关,不再跳设置页。
41
+ - **令牌门禁提示不再重复出现**:填写令牌弹窗内与场景编辑页各删掉一遍。
42
+ - **「新建人设 / 编辑人设」改成「新建子智能体 / 编辑子智能体」**。
43
+ - **提示词新增弹窗标题改成「新增提示词」**。
44
+ - **记忆导入的「导入到场景」改成场景下拉**:列出现有场景,也保留直接输入新名字。
45
+ - **记忆行的体积标签挪到名称旁边**(药丸样式),`bundle` 形态标签不再显示。
46
+ - **回收站详情弹窗定为 720×720**:与原 S 档之间的一档,与列表弹窗一致。
47
+ - **会话页「恢复所选 / 删除所选」上移页头**,紧挨导入、导出、全选。
48
+ - **技能详情的「用系统编辑器打开」改成「编辑器查看」**,与文件路径同一行。
49
+
50
+ ---
51
+
52
+ ## [0.19.1] - 2026-10-10
53
+
54
+ 提示词预设补上「取消应用」,删除保护与回收站一并修好;回收站新增保留期与批量删除。
55
+
56
+ ### 新增
57
+
58
+ - **「取消应用」**:那颗「生效中」的开关现在能关掉了 —— 把 `AGENTS.md` 恢复成开始应用之前的状态;那时没有这个文件就把文件删掉。点之前弹窗会说清是哪种(删文件时按钮变红),点完给一条回执。
59
+ - **回收站保留期**:可选永久保留 / 7 / 30 / 90 天,超期条目由后台清扫自动永久删除,覆盖提示词预设、快捷提示词、子智能体人设、场景、技能、记忆六类。默认永久保留;改设置从此刻重新计时。
60
+ - **回收站批量永久删除**:条目可勾选,「全选 / 取消全选」与「永久删除 (N)」同一行、就地二次确认。技能回收站按上下两块各一套。
61
+ - **场景表单的「全局提示词」与「快捷提示词」各多一个「无」**;「无」是快捷提示词的第一项,也是新建场景的默认值。
62
+ - **History 页的保留期多了「90 天」**。
63
+
64
+ ### 修复
65
+
66
+ - **「取消应用」回不到「没有文件」**:原本没有 `AGENTS.md` 时,连续应用 a、b 之后取消应用,文件永远不消失。
67
+ - **「取消应用」关不掉**:开始应用之前没有 `AGENTS.md` 时走不通,而界面给出的出路也不成立。
68
+ - **「只有一份预设且它生效中」时开关关不掉、删除也删不掉**(死锁)。
69
+ - **删除保护漏了一类**:当前应用的那份预设能直接删掉,删完 `AGENTS.md` 照旧生效、界面上却再没有预设对应它。
70
+ - **删光预设后又被自动重建**:删掉最后一个预设、刷新列表,同名 `default` 又回来。
71
+ - **删除后留下陈旧记录**:删掉某个预设后「最近一次应用」仍指向它,新建同 id 的预设会被误标。
72
+ - **History 页保留期静默误报**:设置值不在预设里(如 15 天)时显示成「永久保留」,其实会到期自动删。
73
+
74
+ ### 变更
75
+
76
+ - **删除保护改成认两类**:场景绑定的、以及当前应用的那一份。首次打开时自动生成的那份副本仍可直接删。
77
+ - **场景表单三处文案**:「提示词预设」→「全局提示词」,「按场景勾选」→「自定义」,两条「无」改成从"这一格要不要设"的角度说话。
78
+ - **快捷提示词选「无」或「保持现状」时不再显示「本场景启用」勾选卡**。
79
+ - **回收站加高到 760**,提示词回收站拆成上下两块(各自滚动、各自一条批量条)。
80
+
81
+ ---
82
+
83
+ ## [0.19.0] - 2026-10-07
84
+
85
+ 子智能体四件事:人设可以标「允许追问」+ 修好自 0.15.0 起完全不可用的 `subagent_manager_run` + 子代理不再把自己当成主代理 + 人设表单的「高级选项」重排;外加「工具限制」的候选修好并分三段。
86
+
87
+ ### 新增
88
+
89
+ - **人设可以标「允许追问」**:勾上后子代理转后台运行,之后可继续追问。
90
+
91
+ ### 修复
92
+
93
+ - **修好 `subagent_manager_run` 自 0.15.0 起完全不可用**。
94
+ - **子代理不再把自己当成主代理**。
95
+ - **修好「模型来源」选定后模型那一格变窄**。
96
+ - **注入框架不再点名被工具限制砍掉的工具**。
97
+ - **修好「工具限制」的候选不是该模式自己的工具**(此前四个模式列的是同一份宿主平面清单,勾不到 `read` / `write` / `pwsh` 这类官方工具)。
98
+
99
+ ### 变更
100
+
101
+ - **串行语义改为「至多一次启动在途」**。
102
+ - **人设表单的「高级选项」重排**:五个字段分三组,提示文字由九处减到一处;模型来源与模型改为只从宿主目录里选(选定来源后模型只列该来源的;目录外的旧值原样列一条「目录里没有」,不再有手填入口);收起态摘要最多两行、只报有值的项。
103
+ - **「工具限制」的候选按「插件工具 / 官方工具 / 其他工具」分三段**。
104
+ - **「工具限制」的候选不再返回全体并集**。
105
+
106
+ ---
107
+
108
+ ## [0.18.5] - 2026-10-05
109
+
110
+ 会话导出分三档累进(仅正文 → + 工具 → + 思考)+ 导出弹窗放大到看得到列表 + 导入可以挑工作区;修好行内「恢复」必报操作失败。
111
+
112
+ ### 新增
113
+
114
+ - **导出分三档,累进**:仅正文 → 正文 + 工具 → 正文 + 工具 + 思考,每一档都是上一档的超集。
115
+ - 中间档是这一节存在的理由:**要工具、不要思考**。思考是模型对自己干了什么的叙述,没有工具调用就没有它叙述的对象 —— 反向那一档(带思考不带工具)没有意义,所以三档只可能是这一个顺序。
116
+ - 附件(图片 / 文件的名字与大小)跟工具一起进中间档:它属于「对话里出现过什么」,不属于「模型想了什么」。
117
+ - 工具结果按上限截断并写明原文总长(一次文件读取就能有几 MB),不设限的话一个会话就能导出上百 MB。
118
+ - 附加段各自成节,且载荷整段缩进 —— 工具结果可以是任意文件内容,不缩进的话它里面的 `## User` 会在再导入时把你的轮次劈开。
119
+ - 后两档是给人看的,不是拿来回流的:再导入时工具输出与思考会并入助手正文;要回流对话请用「仅正文」。
120
+ - JSONL 的 `content` 仍是字符串而不是块数组 —— 块数组会让导入侧把思考又拼回正文,等于把这次修的缺陷原地复活。
121
+ - **导入会话可以挑工作区**:三条路并存 —— 从已登记的工作区下拉里选、浏览一个文件夹、直接粘绝对路径。留空仍归未分组。
122
+ - 下拉只列活登记的那几个。「已移除」的游离目录不冒充工作区(它按定义就是没登记),要用那个目录请走「浏览」。
123
+ - **导出弹窗从 560×640 放大到 720×760**:字段由五行压成三行(格式|导出内容 并一行、会话范围|工作区 并一行),省下的位置全给会话列表。只有列表内滚,提示 / 目录 / 动作行常驻不动。其余四页的导出弹窗与回收站尺寸不变。
124
+
125
+ ### 修复
126
+
127
+ - **归档列表每行「恢复」必弹「操作失败」**:宿主官方 `unarchiveSession` 是 `Promise<void>`,我们的门面把它的返回值原样透传,op 层再去读 `archivedSessionIds` 就抛 TypeError。崩溃点在**构造回执那一行** —— 宿主其实已经恢复成功、工作区记账也补回来了,用户看到的却是一句失败,而且列表不刷新,得手动刷一下才发现它好了。现在回执由门面按权威归档集合自造,op 层不再读注册表的返回值。
128
+ - **导出的正文里混着思考**:取文本那一步只判「这个对象有没有 text 字段」,而思考块 `{type:'reasoning', text}` 恰好符合,于是思考一直和正文拼在一起导出去。现在按块类型取文本 —— 同一条缺陷 0.16.x 已在子智能体侧修过,导出侧是它的第二个出口。
129
+ - 副作用要说清:**同一份会话在 0.18.5 前后的导出产物对不上**,少掉的那段就是当初混进来的思考。
130
+ - 因此「只有思考、没有正文」的助手轮次在简洁档会第一次变成导不出来,跳过原因里会写明是档位问题、不是内容丢了。
131
+
132
+ ### 变更
133
+
134
+ - **导入弹窗那一格改叫「工作区」**(原来叫「项目目录」),与导出弹窗的筛选同名同义;文件要求那一行跟着改口。
135
+ - **恢复回执不再带 `archivedSessionIds`**:界面只用 `ok` / `error` / `workspace`,而归档集合可能有几千条,每次单点恢复都全量回传一遍没有意义。
136
+
137
+ ---
138
+
139
+ ## [0.18.0] - 2026-10-01
140
+
141
+ 斜杠命令「工具」段 + 快捷提示词(含场景绑定)+ 兼容页两段开关与挂载实况。
142
+
143
+ ### 新增
144
+
145
+ - **斜杠命令「工具」段**:对话输入框打 `/` 就能进场景、启停技能 / MCP 服务器 / 子智能体 / 提示词 / 记忆,点完菜单不关、接着点下一条。走宿主官方 `inputTriggers` 通道(不改官方包),只放可逆动作。
146
+ - 六个域各一行,点一行原地进入该域条目(面包屑「工具 › 技能」);启用项绿色对勾、停用项空心框,右侧灰字是条目自己的备注,域行右侧是当前态摘要。
147
+ - 条目按域内唯一的 `key` 定位(技能与 MCP 服务器会重名);点下去先叠本地乐观状态,写成功后按官方口让菜单重取一次候选。
148
+ - 每个外部技能目录多一行「目录名 · 目录」,开得也关得;列表全量给出不截断,技能按来源目录、记忆按场景分组,已启用的在前。
149
+ - 场景域不列两个恒开的保留场景;记忆域默认带上「全局」那一组并钉在最前面。
150
+ - 半截 token 直接按 Enter 会被拦下,不会当普通消息发给模型。
151
+ - **快捷提示词**:提示词页拆成「全局提示词」与「快捷提示词」两段。快捷词不注入上下文,在 `/` 的「快捷提示词」段点一下把正文原样贴进输入框(不自动发送);与预设两份存储(`hub/quick-prompts/`),每条一颗开关管它在不在 `/` 里。
152
+ - 新 op 8 条(list / create / update / toggle / remove + 回收站三条)逐条登记进 `op-registry`,写侧与五个管理域同一条门禁。
153
+ - 数据纪律与预设同级:删除进回收站、可勾选导出成 zip、随整机迁移快照走。
154
+ - **场景可以绑定一组快捷提示词**:「修改场景」里那颗下拉默认「当前启用的」= 不绑、进出不碰;勾了的进场景启用、其余停用,退出按快照还原。空表是合法值(= 进入后全部停用)。
155
+ - **兼容页「斜杠命令入口」一组**:两段各一颗勾选框(新 op `slash-settings`)+ 一枚「已生效 / 未生效」标签(挂载实况由客户端按段上报);功能总览同步多一行。
156
+ - **一条全局轻提示 `showPluginToast`**(右下角):斜杠命令是在对话页按下的,`Notice` 长在页签里、那时设置页根本没挂载。
157
+
158
+ ### 修复
159
+
160
+ - **`scene_manager_switch` 退出场景的回执说「什么都没改」**:判据把"目标就是当前场景"的早退与"真的退掉一个场景"混成同一个形状,模型每次退出拿到的都是 `OK: already in scene「」`。
161
+ - **`/` 菜单进 / 出场景不应用、也不恢复档案**:「启用集合与当前模式恒等」这条原本靠每个调用方各调两个 op 维持,`/` 那一行只调了一个。现在收到服务端兜住,面板 / `/` / 模型工具都只发一次调用。
162
+ - **分组卡片点标题收不起来**(MCP 页 0.11.0 起、提示词页两处):写进"收起 = true"那张表里的值取反错了,每次点击都把同一个值写回去。
163
+
164
+ ### 变更
165
+
166
+ - **档案摘要与切换回执补上「模型工具表」这一档**:`scene_manager_list` 多一格「工具表方案「X」」,切换回执多一句「切到方案「X」(关 N 条)」/「按进场景前的快照还原」;名单本来没变就一句都不说。模型侧不提快捷提示词。
167
+ - **`/` 的「工具 › 提示词」域里两类提示词都是启停行**,贴文字改由「快捷提示词」那一段常驻承担(两个源、两件事)。
168
+ - **提示词页两组换成技能那样的可折叠卡片**(卡片头 = 组名 + 条数);快捷那组卡片头给「全选 / 取消全选」,全局那组不给(单选)。
169
+ - **全局提示词的「应用 / 重新应用」两颗文字按钮换成一颗药丸开关**(在「编辑」左边):亮着的再点一次 = 重新写回 `AGENTS.md`。
170
+ - **「修改场景」弹窗分两模块**(基本信息 / 场景绑定),快捷提示词的勾选清单换成段卡片(段头计数 + 全选,段体按内容长)。
171
+ - **模型工具表里「提示词」这一组改口「全局提示词」**,两条工具的说明点明只管写进 `AGENTS.md` 的基线;没有为快捷提示词新增模型工具。
172
+ - **含下拉与勾选清单的字段外层 `label` 改 `div`**:嵌套 label 会把"点段头空白"转给勾选清单里第一颗复选框。
173
+ - **场景档案弹窗的段脚注撤了**(同一件事在段头计数、未定义提示与脚注各说一遍)。
174
+ - **「新增提示词」弹窗删掉「或从现有预设复制」那一格**(`agentsmd-create` 的 `from` 参数保留,只是界面不再给入口)。
175
+
176
+ ---
177
+
178
+ ## [0.17.0] - 2026-09-30
179
+
180
+ 对抗性审查收尾:三批(P0/P1/P2 表 19 条 + §5 脆弱性地图 F1–F12)与随后一轮复审(14 条发现 + 2 条替代项)全部处理完毕,逐条到终态;P0 / P1 每条都先复现坏行为再修。报告与终态处置表在 `review/`(本地工作稿,按 `.gitignore` 不入版本库)。
181
+
182
+ ### 修复
183
+
184
+ - **记忆索引:一次读失败不再等于「整份配置被清空」**(P0-1):读失败(EACCES / EBUSY)曾被当成「没有索引」,随后任何一次写都会把空索引落盘,界面 5 秒轮询的读操作也会触发。现在只有 ENOENT 算新用户,其余读失败一律按「不可信」处理(拒写 + 界面按全部未启用显示)。
185
+ - **场景回收站:含子目录 / bundle 记忆的场景恢复不再必然失败**(P0-2):负载名拒收带 `/` 的名字,而场景记忆天生是目录树 —— 删除能成功、恢复必失败且不可再恢复;删除回滚失败还会把回收站条目整条删掉。现在负载名支持安全相对路径,恢复失败退回回收站,回滚没做完绝不清理条目。
186
+ - **记忆回收站恢复不再能写到记忆根之外**(P0-3):条目里的组名是磁盘数据,`../..` 能把正文写到记忆根外。现在与回收站列表同一道判据,并在落盘前核对落点是否在根内。
187
+ - **整机迁移快照不再导出明文凭据**(P0-4):默认导出只认 `key` / `token` / `secret` / `password` 四个参数名,`?api_key=` / `?access_token=` / `?sig=` 等全部漏掉。现在与 MCP 列表同一套打码,并补上非绝对地址的兜底;`$VAR` / `!!js` 这类间接引用改回原样保留。
188
+ - **MCP 体检不再回未打码的地址**(P0-5):它是免令牌的只读操作,却把配置里的 URL 原文回给客户端。现在地址一律打码后回(主机与路径保留),命令名仍明文(与 `mcpm-list` 口径一致)。
189
+ - **注入取数失败不再伪装成「已清空」**(P1-8 / F2):某个域抛异常时被当成「这轮没内容」,还向模型发一条假的「已清空」,界面显示成「未投递」。现在异常与真的空分开:抛异常的域这轮不发,「注入实况」新增「取数失败」状态,兼容页那一行同时承载装配失败与运行期失败。
190
+ - **读失败不再改名用户文件**(本版自查):上一批把读失败也接到「改名留存」那条处置上,而读失败常是瞬时的 —— 等于把「重试即可恢复」升级成「记忆全没了」。现在两条路分开:解析失败照旧改名留存,读失败只标记不可信、不动文件,下次读成功自动解除。
191
+ - **场景改名 / 删除→恢复不再丢记忆的索引条目**(P1-1):改名没搬每条记忆的启停 / 排序 / 标签 / 置顶 / 备注,这些条目被当悬空引用清掉 —— 用户显式停用的记忆会自己重新启用。现在改名按前缀整体迁移,删除时一并收进回收站、恢复时合并回来。
192
+ - **删除 / 恢复场景不再跟随目录链接搬走根外文件**(P1-2,已实测复现):`memories/<场景>` 若是指向根外的链接,列目录会列出链接目标的内容,删除会真的把根外文件搬进回收站。现在动手前核对落点是否在根内,遍历时跳过链接。
193
+ - **MCP 导出不再谎报「hub 目录写入失败」**(P1-3):它把一份 JSON 交给了只接受补丁格式的写入器,校验必然失败且错误被吞,界面给的诊断是错的。改用普通 JSON 写入。
194
+ - **停用的 MCP 工具不再能被调用**(P1-4):`mcp__<server>__<tool>` 对 `__` 有歧义,而守卫取第一个 `__`、列表取最后一个、场景档案又取第一个 —— serverName 含下划线时守卫查表不命中即放行,这是**执行侧**失效。现在三处共用同一个切分函数 `splitMcpToolName`。
195
+ - **重复 loader id 守卫不再只扫 MCP 行**(P1-5):导入一条非 MCP 条目就能撞出重复 id,而同 id 会让插件组装失败、DSH 起不来。现在扫全部 insert 子条目(顶层覆盖块不算)。
196
+ - **整机迁移的技能域从「永远不工作」到能用**(P1-6):导出侧读错返回结构,技能永远导出 0 项而界面显示「迁移完成」;导入侧又把 zip 喂给只认目录和 `.md` 的入口。现在导出按正确结构展开,导入改走能吃 zip 的链路。
197
+ - **`history-delete` 收敛到「只能删已归档会话」**(P1-7):批量删除一直求交归档集合,单删却直接删 —— 一个客户端 bug 就能永久删除任意已保存会话。现在单删也先确认在归档集合里(查不到归档状态即拒绝)。
198
+ - **场景绑定的预设正文有了与 AGENTS.md 相同的注入预算**(P2-1):AGENTS.md 分支有 64 KiB 截断,场景分支一点上限都没有。现在复用同一套截断与提示。
199
+ - **全局 AGENTS.md 与场景基线快照改为原子写**(P2-2 / P2-16):AGENTS.md 是宿主每步都重读的文件,中断可能留下半截内容进模型上下文;基线快照损坏会让「退出场景恢复 AGENTS.md」静默失效。现在两者原子替换,快照读不出来时如实报警。
200
+ - **编辑 / 删除 MCP 不再删掉手写 `config` 的覆盖块**(P2-6):补丁按条目 id 生效,手写配置是合法用法,删除时却被整块带走。现在只删纯块;「启停值读不出来」(如 `!!js …`)也不再被当成显式启用。
201
+ - **去重读的不再是「另一个文件」**(P2-19):全局指令路径有两条来源,去重时用了不是宿主实际读的那一份,同一份预设正文被注入两遍。现在由调用方把宿主实际读的那一份喂进来。
202
+ - **保存场景档案不再抹掉别的场景**(P2-3):档案切片在写队列外读、队列内写,窗口里另一个写者的改动会被陈旧整片回写覆盖。现在每次写显式声明改哪几片,档案另走逐场景增量。
203
+ - **场景名口径统一:命名用单段、定位用完整路径**(P2-4):多段名(`a/b`)能通过校验并被写进启用集合,但注入时两边对不上,表现为「开关点了、场景没生效」且零报错。现在命名路径必须单段(多段当场报错),定位路径按完整路径寻址。
204
+ - **备份名加上毫秒与进程内序号**(P2-5):时间戳只到秒,同一次操作连写两遍时后一份覆盖前一份,「保留 5 份」实际变成「保留 5 个秒」。两代格式都认,存量备份仍会被清理。
205
+ - **行级编辑不再改坏块标量**(P2-7):折叠空行会把 3+ 连续换行折成 1 个,而块标量(`!!js |`)的内容就是换行与缩进 —— 折一次等于改写用户手写的表达式。现在跳过块标量内部,认不出形状时退化为旧行为。
206
+ - **`tools.restrict` 缺失时不再静默**(P2-8):全局 tools 面没有 `restrict` 时直接返回,停用工具仍留在模型可见的工具表里,兼容页还报「ok」。现在与另一处同 id、同文案地上报。
207
+ - **整机迁移导入不再吞掉各域的「需要注意」**(P2-9):只取成功 / 跳过数,于是「这些密钥已是打码占位符,请重新填写」到不了界面。现在透传并渲染(记忆域带上跳过原因,上限 5 条)。
208
+ - **`mcpmRestart` 不再把服务器留在停用态**(P2-11):某些形状下(条目自带 `disabled: true`、靠覆盖块启用)恢复步骤会把生效值回落到条目自带值。现在恢复前比对一次,不等就显式写回。
209
+ - **令牌操作不再把「覆盖条目」当成「第二份补丁」**(P2-12):判据只对 insert 条目成立,而 0.1.7 bundle 挂载下令牌的写点就是覆盖条目 —— 那种安装下所有令牌操作被全量拒绝。现在按形状分类,写点优先取覆盖条目。
210
+ - **不可解析的超时值不再写成 `NaN`**(P2-13):手写补丁里 `toolCallTimeoutMs` 被读成字符串,`Number("30s")` 直接把 `NaN` 落盘。现在认不出来就整行不写,`0` 也不写。
211
+ - **「已知工具」侧车的读-改-写整段进写锁**(P2-15):两个并发写者各读旧表、各并进自己那台服务器,后写的整份覆盖先写的。现在锁内读 → 合并 → 落盘。
212
+ - **技能上传不再能从暂存目录逃出去**(P2-17):路径校验只挡「正好是 `..`」的段,而 Windows 会裁掉段尾的空格,`.. ` 等于 `..`。现在按段判「会不会被文件系统改写」,正常点文件(`.DS_Store`)照常放行。
213
+ - **子智能体列表不再列出管不动的隐藏人设**(P2-18):隐藏名(`.foo`)被判 hidden,列表里却出现一个「看得见、改不了、删不掉」的人设。现在列表侧与校验侧同一道谓词。
214
+
215
+ ### 修复(复审)
216
+
217
+ - **`skill-trash-delete` 的路径穿越堵住**(F1,P0):`id` 直接拼进回收站目录路径,`id=".."` 就能把整个 `hub/trash` 交给系统回收站。现在走既有的单段名校验。
218
+ - **「读改写例外」不再被借道**(F2,P1):`tool-table` 免令牌的依据是「纯读」,而「保存方案 / 删除方案」走同一个操作名却会写侧车。现在写条件改为数据化声明:带写触发键就必须过令牌。
219
+ - **场景锁定对模型面生效**(F3,P1):冻结只包在界面那条入口上,锁着一个非活动场景时模型仍能改技能 / 记忆 / MCP / 子智能体 / 场景档案。现在两侧同一份判据;「锁着仍能解锁、仍能退出场景」用契约测试钉住。
220
+ - **打码 URL 不再被写回补丁**(F4,P1):新增 / 导入 MCP 拿到的是已打码的地址,写回时不做还原,`%3Credacted%3E` 真的落进补丁。现在所有写路径强制还原,还原不出来就报错要求重填。
221
+ - **打码链补上 userinfo 与 fragment**(F5,P1):`https://user:pass@host/…` 与 `…#access_token=abc` 原样输出,而这两种形态在托管服务里都常见。现在一并打码。
222
+ - **块标量识别按 YAML 规范补全**(F6,P1):识别只认 `|` / `>` 紧跟指示符的形态,`!!js |` / `&a |` / `|2-` 都不算,照样被折 = 改写手写表达式。现在按规范最小集补齐,另加「认不出的疑似块标量头 → 整份文件不折叠」。
223
+ - **注入通道的「取数失败」覆盖到域内部**(F7,P1):上一轮只堵住通道拿到异常那一层,而某个域自己就把 IO 错误吞成空串。现在域内部也把 IO 失败与真的空分开;文件不存在仍按正常空处理。
224
+ - **「首选」对模型真正生效**(F8,P1):界面与模型侧共用同一个分组函数,而 provider 那条路径没传 `preferred` —— 同名首选只影响界面显示。现在 provider 路径传上;首选来源处于停用时如实回报「已记录,但它不会生效」。
225
+ - **单删的归档判据取权威集合**(F9,P2):单删用有损投影(头部读不出来的会话被静默跳过),批量路径用权威集合 —— 同一份数据两条路结论相反。现在单删也取权威集合。
226
+ - **「只能删已归档」成为不变量**(F10,P2):级联删除按父子关系直接删、不问归档集合,删一个已归档父会话会连带删掉未归档的子会话。现在只吃已归档的子会话,读不出归档状态时什么都不级联。
227
+ - **记忆回收站恢复失败会回滚**(F11,P2):复制中途失败留下「半放回 + 目标已非空」,而条目还在 —— 下一次恢复撞「同名记忆已存在」,这条记忆再也恢复不了。现在失败时清掉落点并保留条目,可直接重试。
228
+ - **`.txt` 按内容嗅探,不再一律当纯文本**(F12,P2):改名成 `.txt` 的 JSONL / Markdown 转写会被整份折成一条 user 消息,而返回的是「导入成功」。现在先嗅探,认不出且行数不少时如实提示。
229
+ - **引用探测失败不再放行删除**(F13,P2):`refs()` 返回 `null` 时放行 —— 删掉被场景绑定的预设会静默让场景驱动失效。现在探测失败一律拒绝,并说明是「探测失败」而非「有引用」。
230
+ - **场景基线写失败不再被吞**(F14,P2):失败只写一行 `warn`,AGENTS.md 照旧切进场景态而没有退路,界面零提示。现在返回失败原因,与「AGENTS.md 未写入」分开上报。
231
+
232
+ ### 新增
233
+
234
+ - **兼容探测表新增 `fs.patch-io`**(F5):补丁文件的读写要经 `ctx.fs` 升级沙箱策略,五个方法任一改名会让 19 处补丁写路径一起报错。现在钉在兼容页上;「参数语义变了」探不到,如实分开。
235
+ - **挂载心跳带上宿主进程身份**(F1):额外记 `pid` 与 `hostStartedAt`,`check:host` 据此直接给结论(写心跳的进程还在 → 这一轮确实挂上了;已不在 → 宿主重启过)。局限:进程号会被复用。
236
+ - **doctor 新增 `AGENTS.md` 增量刷新的 drift canary**(F3):官方改成事件驱动 / 改 digest 口径时旧正文会继续注入且零报错。现在加一组源码标记检查,缺失时直说影响面。
237
+ - **`hostRootCandidates()` 成为「宿主在哪」的唯一口径**(F10):运行时、doctor、host-deps 此前各写一份,doctor 还少了桌面版归档那条(桌面宿主上会报「找不到宿主」或比出假的「两份不同拷贝」)。现在三处共用一份。
238
+ - **`mcpmListView` 上报 MCP 工具前缀的漂移**(F6):前缀抽成 `MCP_TOOL_PREFIX`(唯一一处)并加一条 inform-only 上报。判据是「`mcp` 词根后换了分隔符」且至少两个同名根的工具 —— 第一版没排除本插件自己的 `mcp_manager_*`,会让这条在每台机器上误报,已自查改掉。
239
+ - **服务器名的 `__` 歧义会出声了**(N2):`serverName` 允许含 `__`,于是「`a` 的 `b__c`」与「`a__b` 的 `c`」在全名上同形。本轮不收紧校验,改为加一条 inform-only 上报,两种形状取更具体的那条只出一行;判据是纯函数且零误报,只上报、不阻断、不自动改名。
240
+
241
+ ### 变更
242
+
243
+ - **两份 peer range 不再漂移,且明确「不设上界」**(F9 / §5.4):`probe.ts` 与 `package.json` 此前是两个写法(且前者 caret 隐含上界,与注释自相矛盾)。现在两处是同一个字符串并由契约测试钉住;无法用 range 消除的缺口(尚未枚举的新 rc 在 npm7+ 下仍会 ERESOLVE)写进注释。
244
+ - **契约测试共补 34 条不变量**(`test/contracts.test.mjs`,三批 18 条 + 复审 16 条):全部钉纯函数不变量与宿主契约,不加界面测试。
245
+
246
+ ### 说明
247
+
248
+ - **实测**:`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` 正常跑完。
249
+ - **先复现再下结论**:复审 14 + 2 条每条都先复现坏行为,修完再把修复回退掉重跑同一份探针 —— 只证明「改完是绿的」不足以说明探针在判别。回退后转红数:F9 / F10 5 项、F11–F14 10 项、N1 7 项、N2 2 项。
250
+ - **N1 在本机是 no-op(如实标注)**:本机 7 个已配置 serverName、105 条已知工具,无一含 `__`,停用表为空 —— 三种切法逐条比对 0 条不一致,这次统一切法是为将来修的。**残余风险**:两个真实服务器名互为 `__` 前缀时,守卫(候选必须窄,否则 fail-open)与显示侧仍可能给出不同答案,由 N2 的上报把它变成可见提示。
251
+ - **未做的验证**:按 `AGENTS.md`,功能验证由用户在真实环境完成 —— 本次未在真实宿主里点过界面。三处只做了静态核对:`mcpmListView` 的前缀漂移上报、`webServer.register` 失败的运行期上报、备份名的新格式。
252
+ - **本版仍未处理的部分**:两份报告里没有了。两处明确不做、记录在案:① §5.4 余下两条属持续维护成本(每出一个宿主 rc 需手工同步 5 处、桌面宿主缺「布局漂移」上报),记在适配矩阵里;② **F15 不收紧**(拒绝含 `__` 的 `serverName`)—— 今天放行 `__` 的 5 处校验一旦收紧,存量服务器会从「能管」变成「管不了」,改由 N1 + N2 处理。
253
+
254
+ ## [0.16.6] - 2026-09-30
255
+
256
+ 官方内置技能管理补全 web 侧:web 宿主照注的沙盒诊断技能接入技能页(可见、可停),Office 三件套按裁定在 web 上一并暴露;并补齐接管后缺失的 LibreOffice Kit 路径段。
257
+
258
+ ### 修复
259
+
260
+ - **web 宿主注入的沙盒诊断技能现在看得见、关得掉了**(0.16.5 的误判):0.16.5 按「web 不注入官方技能」把 web 整个挡在官方内置管理之外,但官方宿主的沙盒技能门控是 `process.platform === "win32"`(`dsh-sandbox-local` 源码核对)——只看操作系统,web 照样向每个会话注入 diagnose-windows-sandbox-acl,于是 web 上「页面不显示、会话照注入」。现在 web 也物化官方技能并以 rank 599 接管:来源出现在技能页,停用即不注入。
261
+ - **接管后缺「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」降级文案 —— 绝不给跑不起来的路径。
262
+
263
+ ### 变更
264
+
265
+ - **官方内置技能按宿主形态各物化一份**:物化目录从各宿主共用 `$DSH_HOME/tool-management/official-skills/` 改为 `official-skills/<desktop|web>/` 各写各的 —— 0.16.5 靠「web 完全不参与」压住竞态(web 重建会把桌面物化好的 4 个清成它解析到的 1 个,实测),分形态目录让 web 也能参与管理而不互踩;0.16.5 共享布局的顶层残留按已知名单自动清理。启停状态按技能名记在来源 `official` 下,两种形态共用一份。
266
+ - **web 技能页也暴露 Office 三件套**(用户裁定):web 宿主不装配 office 插件、不注入,但 npm 包自带完整 assets —— web 上从宿主进程解析链物化后照常列出、可启停(启用后随技能目录注入会话)。
267
+
268
+ ### 说明
269
+
270
+ - **实测**:官方源码逐处核对(沙盒技能门控 `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 降级文案,正文不含指向不存在布局的路径)。
271
+
272
+ ## [0.16.5] - 2026-09-30
273
+
274
+ issue #1 收尾与桌面版第二轮适配:兼容页身份比对改为逐包解析、逐包核对(桌面版不再误报「两份不同拷贝」),「全部可用」与「N 项不可用」不再同屏;桌面版注入会话的 4 个官方内置技能接入技能页管理。
275
+
276
+ ### 修复
277
+
278
+ - **桌面版兼容页误报 5 条「两份不同拷贝」**:宿主侧的身份比对把「realpath 机制整轮不变」错写成了连**解析结果**一起复用 —— 第一个包(cordis)的宿主侧入口路径被当成其余五个包的宿主侧路径,五条全部比成「与 cordis 不同」→ 5 条假阻塞项,banner「能力 18/18 · 全部可用」与红卡「5 项不可用」同屏(桌面版 0.2.0-rc.2 实测全中)。现在逐包解析、逐包取真实形态 —— 解析本就便宜,Node 自身还有缓存;同日新旧对比实测:旧代码 1 真 / 5 假 + 5 条阻塞,修复后 6 真 / 0 阻塞。
279
+ - **安装形态下的修复指引不再是跑不了的命令**(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 查看」同理分两键,安装形态下不再指命令。
280
+ - **路径取不到真实形态时不再编一个「两份拷贝」的结论**(issue #1 次要问题 2):`realPathOf()` 以前 `catch { return value }`,把「这条路径不可解析」静默降级成「拿输入去比较」—— 于是路径/权限问题看起来就是「插件与宿主加载的是两份不同拷贝」,用户照着它去修只会白费功夫。现在取不到真实形态就**如实记原因**(`error.code` 与消息原文),这类包给 `sameAsHost = null`(比不了)并单独出一条说明,带包名、哪一侧(`host` / `plugin`)、解析到的路径与失败原因;界面显示「无法比较(路径取不到真实形态)」并列出两侧。
281
+ - **兼容页不再一边「全部可用」一边挂着红卡**:能力注脚与红卡高亮此前把「身份待处理」(两份拷贝这类 —— 不影响能力可用性)混进了能力降级计数。现在两处只看能力降级数;汇总行三分:全可用 / 能力降级 / 身份待处理(新增词典键 `compat.summary.identity`),各说各的。
282
+
283
+ ### 新增
284
+
285
+ - **官方内置技能接入管理**:桌面版宿主向每个会话注入 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)不注入会话上下文,不列(用户裁定)。
286
+
287
+ ### 变更
288
+
289
+ - **源码检出与 npm 安装形态的行为差异,只在指引上一处**:`/dsh-plugin-tool-management` 里有没有 `scripts/host-deps.mjs` 决定给哪句指引(本插件不从 `scripts/` 加载任何东西),其余判定完全一致。
290
+
291
+ ### 说明
292
+
293
+ - **收尾范围**:issue #1 的主因(`import.meta.resolve` 的 URL 未解码,含空格路径必现;macOS 上开头斜杠被一起删掉)已在 0.16.0 随 `fileURLToPath` 修掉,本版带次要两条的收尾、身份比对的逐包核对与官方内置技能管理。
294
+ - **实测**:源码检出与安装形态两种位置的 `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/` 相对结构保留。
295
+
296
+ ## [0.16.0] - 2026-09-29
297
+
298
+ ### 修复
299
+
300
+ - **桌面版被误判成「两份不同拷贝」**:桌面版 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 实测)。
301
+ - **宿主版本显示 `unknown`、带空格的安装路径上身份比对必然失败**:`import.meta.resolve` 给的是 URL,插件把 `%20` 当成普通字符留在路径里 —— 「D:\DeepSeek Harness\...」这种路径于是永远打不开,版本读不出来,比对也就必然不等。改用 `fileURLToPath` 解码(0.1.5 起这条路就有,只是此前没人在带空格的路径上装过)。
302
+ - **MCP 体检补上端点探测**:此前只查配置格式,一条编造的 streamable-http 地址也能拿绿点(2026-09-29 GUI 测试发现)。现在格式对了就对配置地址 GET 一次 —— 带配置的鉴权头、5 秒超时、不读响应体,与宿主连接该服务走的是同一地址同一头部;连不上点黄,说明里带原因(域名解析失败 / 连接被拒 / 超时 / 证书校验失败)。逐行检查同时改成并行,「全部检查」不再被挂掉的服务按行数排队拖慢。
303
+ - **删除 MCP 服务同步清掉引用**:只删补丁行的话,引用它的地方全成死键 —— 场景档案的勾选与备注、停用表、「已知工具」缓存、服务器备注现在一并摘掉;被**锁定**的场景档案是用户显式冻结的,跳过不动并在回执里说明。删除后等宿主 loader 摘条目(最多 5 秒),等不到就明说「列表可能短暂残留它的行,宿主收敛后自动消失」—— 此前那条 `include:*` 残留行无声出现、约一分钟后自己消失,用户只会以为没删干净(2026-09-29 GUI 测试发现)。
304
+ - **MCP 页轮询不再空转重渲染**:本页每 5 秒轮询一次,此前即使带回的数据一模一样也整页换一批新对象 —— 缓存计算、React 协调、开着的弹窗全部跟着空转,点击与输入都可能被这阵重渲染打断。现在内容没变就跳过整页更新(2026-09-29 GUI 测试发现)。
305
+
306
+ ### 变更
307
+
308
+ - **「插件适配版本」改标 0.2.0-rc.2**:桌面版首发版本已实测通过(宿主版本读得出来、18 项能力全通过、归档宿主的身份判定见下条),`VERIFIED_HOST_VERSION` 与 `EXPECTED_PEER_RANGE` 一起加上它 —— 宿主比自己验证过的版本新时,那条「实际宿主与验证过的版本不同」的提示就不再无谓地刷在桌面上(web 宿主 0.1.7-rc.2 会开始提示,这是事实,不是故障)。
309
+ - **兼容页的三张指标卡只在有事要说时带注脚**:「宿主版本」下面那行「最低要求 ≥ 0.1.5-rc.2」删掉(那是**安装期**的 peer 下界,摆在这里会被读成对当前宿主的断言)、「插件适配版本」下面那行「本插件按此版本验证」删掉(同一件事说两遍)、「可用能力」全通过时不再写「全部通过」(分子分母已经说了)—— 降级与「缺口由插件自补」两种仍照旧说清楚(2026-09-29 用户裁定)。该 peer 下界仍留在 `compat-status` 的载荷里(doctor 与外部脚本可读),只是不再显示;配套的界面词典键 `compat.peer`、`compat.verified.note`、`compat.caps.all` 一并删掉。
310
+ - **四个域的行状态统一成名字后面的描边胶囊**:MCP「已运行 / 未运行」改「已启用 / 未启用」、技能与子智能体「已停用」改「未启用」、记忆「本条已停用」改「未启用」(「场景未启用」措辞不动)。配色按语义分工:绿=生效中、灰=没生效但不是故障、橙=当前没可用工具 / 诊断异常、红=启动失败 —— 停用类不再是橙色。
311
+ - **MCP 的体检状态点挪到名字前面**:以前它在标签列里,读一行要先穿过名字才找得到那颗点。点占的 14px 单独成槽,名字、备注与表头一起对齐到槽的右侧(2026-09-29 用户反馈名字比下面的备注右移、没对齐)。
312
+ - **子智能体启用时也挂「已启用」胶囊**:以前只有停用的那颗,"没有标签"是不是等于启用得猜。
313
+ - **MCP / 技能 / 记忆三页取消「状态」列**:状态跟着名字走之后那一列空了,表头少一项,行网格从四列收到三列。
314
+ - **MCP 行固定两行预算**:标签(工具数 / 层级 / 重名)从独立的标签列并进备注那一行 —— 带不带备注的行高一致(此前带备注的要高出约一档),行网格再收到两列、表头只剩「服务名称与地址」。技能与记忆仍是三列。
315
+ - **窄档(面板 <780px)的 MCP 行高 81px → 69px**:58px 的行下限是三行时代留下的,动作组又仍跨着两个空行、白付两格行距;两处都按两行内容重算(上下各 11px 内边距不变)。
316
+ - **MCP 行去掉「重启」按钮**:重启就是那枚开关的关→开,用户自己拨即可。只有它用的「重启中… N 秒」横幅(连同那枚每秒重渲染的计时组件)一并删除,三处「点「重启」重试」的提示改说「把开关关掉再打开重试」。行右侧剩 开关 / 检查 / 详情 / 编辑 / 删除;模型侧的 `mcp_manager_switch(action=restart)` 与「最近改动」里的重启记录不受影响。
317
+ - **MCP 第二行改成标签在前、备注在后**:工具数那枚短事实先读到,长备注留在行尾自己截断。
318
+ - **「最近改动」的说明句拆成两条**:「记什么」与「会不会涨」各一条,用字段说明同款的条目样式,不再是一整段;「记什么」那条去掉括号里的补语。
319
+ - **「修改场景」的提示词预设说明改成一句**:原来两条(启用即以它为全局基线 / 启用期间应用别的预设 = 改绑)压成「为当前场景设置全局提示词」。条目符号留着,「场景名」的说明也一并挂上 —— 这张表单里字段说明同款(校验报错那句仍是红字,不进清单)。
320
+
321
+ ## [0.15.0] - 2026-09-28
322
+
323
+ 适配 DSH 0.1.7-rc.2(升级后五处失效逐项修复),并带五件增量功能。
324
+
325
+ ### 新增
326
+
327
+ - **兼容探测表补上 0.1.7 的两块契约面**:新增 `settings.document-path` 与 `preset.roster-surface`,健康行常显实际观测到的路径 / 读取方式,官方再改语义一眼见底。
328
+ - **主目录推导自检**:推导失败从静默抛错升级为具名上报,按不变量自检、恢复即收;名册兜底只在真异常时留痕,健康一律不亮黄。
329
+ - **MCP 页「导入 / 导出」**:粘贴社区 JSON 一次建齐,名字净化、传输判定、重名去向在预览里说清;导出含明文凭据警示。服务端零改动。
330
+ - **MCP 配置体检**(新 op `mcpm-inspect`,只读):每行一枚状态点,查命令在不在 PATH、URL 写法、字段形状、服务名撞车;配置一改旧结果作废。
331
+ - **「最近改动」流水**(新 op `audit-list`):谁、什么时候、动了哪条,三方来源各标各的;只记对象名、参数一律不取,同秒同来源合并展示。
332
+ - **场景可绑模型工具表方案**:进场景把关停名单整体换成方案那份,退出按快照还原;绑定入口在「修改场景」表单,改启用中场景立即生效。
333
+ - **整机迁移快照**(新 op `snapshot-export` / `snapshot-preview` / `snapshot-import`):一个目录带走全部域,MCP 默认打码;导入先预览、勾选域再执行,逐域走各自的导入口。
334
+
335
+ ### 修复
336
+
337
+ - **MCP 列表与注入失效**:0.1.7 的 `settings.prepareDocument()` 返回语义变了,插件把 profile 目录当成主目录、读错补丁文件;现在两种形状都认。
338
+ - **预设边界整片「无法判断」+ 极简下技能 / 提示词不注入**:0.1.7 把名册 `read` 改名 `readDocument`;读取统一收敛到「`read` 优先、`readDocument` 兜底」一个出口。
339
+ - **「判断不了」改「无法判断」**(兼容页两处)。
340
+ - **访问令牌卡片的两句文案**:没令牌时不再说吓人的话;「找不到加载器行」改成按用户能做的动作说。
341
+ - **技能页误报「无法从宿主读取活动工作区」**:项目目录已删是常态而非故障,静默跳过。
342
+ - **host-deps / doctor 找不到宿主**:发现序列加上 npx 缓存扫描;doctor 对悬空老树出一条警告。
343
+ - **「设置令牌」在 0.1.7 失效**:bundle 挂载后补丁里没有 loader 行;改写进 profile 补丁的覆盖条目(官方支持的 id 定向覆写),bundle 文件永不落密钥。
344
+ - **功能总览「注入域开关」报 6/5**:分母改从 `INJECT_DOMAIN_KEYS` 取。
345
+ - **「场景锁定」的灰胶囊标签张冠李戴**:改成独立的「锁定中」。
346
+ - **会话列表标题显示成 ID 长串**:调官方投影缓存传参不符官方契约、抛错被静默吞掉,标题从没读到过;改回官方两参签名并加旧格式兜底(2026-09-28 用户反馈)。
347
+ - **功能总览在英文界面下半页中文**:句子归客户端词典、数值归服务端,对不上的回退服务端原文(2026-09-28 用户反馈)。
348
+
349
+ ### 变更
350
+
351
+ - **peer 范围逐代枚举**:改为 `^0.1.5-rc.2 || ^0.1.7-rc.2`;`VERIFIED_HOST_VERSION` 升到 0.1.7-rc.2。
352
+ - **恢复归档改走 0.1.7 新增的原生 `unarchiveSession`**:运行时探测自动切到 native 路由。
353
+ - **核对 0.1.7 工作区状态新增的置顶字段**:插件全部 `setState` 均为展开式写入,置顶数据不受影响。
354
+ - **兼容页三块改成顶部按钮 + 弹窗**:「最近改动」「整机迁移」「注入实况」不再常驻长页;「最近改动」固定尺寸、只滚列表,整机迁移的目录可浏览选择。
355
+ - **改动记录可以清了**(新 op `audit-clear`):两步确认;清空本身也留一条记录。
356
+ - **「预设注入边界」的行名改成模式名**:标准 / PTC / 极简 / 创造模式,子智能体高级选项四行同批;顺带修好一直显示原始 id 的 trust 缺省错误。
357
+ - **场景档案改 2×2 网格,四段同屏**:各段段内滚动,弹窗加大;「子智能体集」「记忆集」更名。
358
+ - **兼容页留白收一档**:块间距收紧,分组更清楚。
359
+ - **「功能总览」的琥珀只留给功能出问题**:停用类两行恒为「正常」,停用构成写进说明(整台按台、单独按个);「模型工具表」说明收敛成一句。
360
+ - **「最近改动」的时间列恒显「月-日 时:分」**:原先当天条目只有时分,跨天分不清是哪天的。
361
+
362
+ ## [0.14.0] - 2026-09-23
363
+
364
+ ### 破坏性
365
+
366
+ - **模型工具改名并合并,共 20 条**:五个「新建」统一成 `_save`(有则改、无则建,回执说清走了哪条);六个域的启停统一成 `_switch`;`mcp_manager_set_enabled` + `mcp_manager_restart` 合成 `mcp_manager_switch(server, action, level?, tool?)`。场景从记忆里分出来,自成一族三条 `_list` / `_switch` / `_save`,记忆族保持 `memory_manager_*`。**旧名不留别名** —— 别名会常驻每一轮请求,比这次省下的还多。
367
+ - **出厂默认关掉 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`。判据是这些信息或动作常态下由注入段与面板承担。**只在从没动过那一页时生效**,存过的选择(含"一条都不关")照原样;「兼容」页可逐条打开,也能整批换回。
368
+
369
+ ### 新增
370
+
371
+ - **模型能进入 / 退出场景**(`scene_manager_switch`):与界面「进入场景」走同一条路径 —— 按档案整套启停 MCP / 技能 / 人设、注入收窄成该场景的记忆、把绑定的提示词写进 `AGENTS.md`(覆盖前留备份)。改的是整个运行时环境,默认要用户确认。
372
+ - **模型能查、能建场景**:`scene_manager_list` 列出每个场景的档案、绑定的预设、锁没锁、几条记忆;`scene_manager_save` 建场景 / 写档案 / 绑提示词。档案是**整段替换**,所以清单先看现状、回执再列出被挤掉的项(`mcp 4 项 → 2 项(-B、-C)`)。
373
+ - **MCP 三项能力**:改一台已配置的服务器(省略的字段保持原样,全程不碰明文凭据)、只停某个工具、顺手写备注。
374
+ - **技能两项**:整个来源目录启停(`source` 参数);改写本插件自己写的那份(新 op `skill-update`)。
375
+ - **人设「思考强度」**:在高级选项里与「模型」并排,档位由所选模型声明。换了模型而旧档位不在新清单里会自动清掉并告知;拉取失败不动已存的值。
376
+ - **「模型工具表」能存方案**:合计行右侧「保存方案 / 恢复方案」。方案存的是关掉的名单,最多 20 份、名字不能重复(保存永不覆盖);恢复清单第一条是不可删的**出厂默认**,自己存的可在同一弹窗里删。
377
+ - **注入按域分家**:「场景」与「记忆」各成一段,可以单独关掉记忆段而保留场景说明。⚠️ 升级后每个会话会重发一次这两段(旧消息认不出来),一次性代价。
378
+ - **提示词清单带描述**:模型能在预设之间做选择(描述上限 300 字,输入框有字数计数)。
379
+
380
+ ### 变更
381
+
382
+ - **注入只写"现在是什么"**:六个板块的"什么时候该想起我"动作句、机制解释、重复的权威声明全部删掉,框架只剩标题 + 正文 + 一句"以本份为准"。四个板块合计 **823 → 643 tok/轮**。
383
+ - **注入层级定稿**:板块 `#` / 场景 `##` / 条目 `-`(此前板块标题与记忆里的场景分组平级,模型读不出主次)。
384
+ - **场景段只剩一行**:`**「代码」—— 用户描述:写代码**`;一个具体场景都没启用时整段不注入。`global` 的分组标题改成 `## 常驻信息`。
385
+ - **记忆段的授权语定稿**,整段只说一次:`以下是当前场景对应的记忆;冲突时以实际情况和用户目前的对话为准;无关勿提;以下就是全部信息:`。
386
+ - **MCP 段不再列工具数**(模型拿这个数字做不了事);备注前缀统一成「用户提示:」。
387
+ - **关掉的工具不再被点名**:目录截断提示、"没找到 → 去调某条工具"那几句会随开关自动改写,不会把模型指向一条不存在的工具。
388
+ - **`tool-table.json` 里的旧工具名自动迁移**(读侧翻译一次并回写盘,幂等),存下的命名方案一起迁移。不认识的名字原样保留。
389
+ - **「功能总览」的「模型工具表」一行**改按"用户自己关掉的条数"判状态 —— 出厂默认不算降级。
390
+ - **`subagent_manager_run` 描述瘦身**(407 → 338 tok):删掉与参数说明逐字重复的部分,约束一句没减。
391
+ - **子智能体高级选项折叠后的摘要固定排两行**,长名字不再被折成竖排。
392
+
393
+ ### 修复
394
+
395
+ - **工具描述引用的注入板块名悬空**:记忆段拆开后板块标题改了,`memory_manager_list` 还指向旧名字,模型照着找找不到。补了一条契约测试扫描这类跨模块引用。
396
+ - **`prompt_manager_list` 报错过「生效中」**:场景接管时它按"文件内容比对"判,与界面两套答案。现在两边同源,并区分 `[active via scene]` / `[active via file]`。
397
+ - **改配置会静默清空凭据与思考强度**:`mcp_manager_save` 省略 headers/env、`subagent_manager_save` 省略 `reasoningEffort` 时会被整份重写清空 —— 现在省略即保持。
398
+ - **自定义目录里的技能"列得出、调不动"**:读取正文时不查自定义根,静默返回"没有这个技能"。
399
+ - **「采纳」统计不再把「已清空」通知当成正文**:第三列此前一直是第二列的复本。
400
+ - **记忆正文不再"逃出条目"**:正文里手写的 `#` 会渲染成与场景标题平级的大标题,现在整段包成代码块。
401
+ - **MCP / 技能族的悬停不再承诺没有的字段**:此前写着"可带 provider、模型与工具限制",而工具签名里根本没有这些参数。
402
+ - **`prompt_manager_apply` 回执的生效时机说错了**:写「next session(当前会话不变)」,而宿主每一步都会 stat 比对并重读 `AGENTS.md` —— 实际**下一轮就生效**。三处口径(回执两条分支、`prompt_manager_list` 尾注)统一,模型不再劝用户重开会话。
403
+ - **`scene_manager_save` 的参数说明引用了已删除的授权语**:还说场景说明注入后"模型会被要求照办",与注入定稿(场景段只陈述现状、不带指令)不符;改为如实说明去向(出现在「本机当前的场景」reminder 里),"写成指令而非备注"的写作引导保留。
404
+ - **静态描述与回执不再点名出厂默认关闭的工具**:场景族三条的互指改成中性说法(the scene listing / 「本机当前的场景」reminder),`scene_manager_save` 与 `subagent_manager_save` 回执里的 `_switch` 点名按 toolVisible 分叉(部分启用时模型会被指向一条自己没有的工具)。**新增契约测试**钉住「静态 description 不得点名出厂关闭的工具」,与板块名悬空那条同一族。
405
+ - **两条清单描述的口径对齐实际输出**:`mcp_manager_list` 不再说"注入的就是这份清单"(注入段是筛过的视图、停用服务器不进 —— 现在把这个盲区写成模型的行动依据:要查停用的用 all=true);`skill_manager_list` 不再说用它"拿正文"(它给的是源文件路径,正文走 `skill_manager_read` 或文件读取)。
406
+
407
+ ## [0.13.0] - 2026-09-23
408
+
409
+ ### 新增
410
+
411
+ - **模型侧补五个工具,15 → 20**:`memory_manager_set_enabled` / `_update`、`subagent_manager_set_enabled` / `_create` / `_update`。分布此前是歪的 —— 技能与 MCP 两域模型能启停能新建,记忆与子智能体却**只读**:看得到一份记忆、看得到一个人设,开关拨不了、内容改不了,只能回一句"请到界面上点"。底层那五个 op 连门禁(写令牌 / 场景冻结 / 档案同步)都齐,缺的只是接线。提示词按裁定只留 `apply`。
412
+ - **所有会改东西的工具都写明"要用户开口或先同意"**:启停类一句 `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` 说明了四遍。
413
+ - **模型工具表可以关**:工具表**每一轮请求都随工具发一遍**,20 个工具的整份定义合计 ≈3,450 tok(宿主口径:整份 JSON 除 4),这一轮用不上也照付。兼容页新增「模型工具表」块,逐个工具勾选、按域全开全关,关掉的**整份不进请求** —— 只把描述写短是重编码同样的事实,这才是唯一真省钱的杠杆(实测:关掉 6 个管理类工具省 ≈1,115 tok/轮)。数字全部来自**注册时量到的整份定义体积**,界面上的 ≈ 与分组合计同一个来源,默认一个都不关。配套两处:关掉的工具在**执行侧**也拦住(可见性那半边万一没生效,名字也不该被执行),注入文本里点名它的那几句跟着换话术(技能 / 子智能体目录的截断提示与两条 `how` 行)—— 点名一个模型手里没有的工具,只会让它去猜名字。**面板不受影响**:114 个 op 与工具表互不相干,关掉 `mcp_manager_add` 之后 MCP 页照样能加服务器。
414
+ - **`skill_manager_read`**:按名字一次拿到技能正文。此前要两步(`skill_manager_list` 取路径 → 自己读那个文件),而目录只有名字没有路径、同名常几份并存,自己挑路径很容易读到被覆盖的影子副本 —— 读完以为在用这个技能,其实生效的是另一份。新工具先走 `skill-state` 的胜出者判定再读,读到的就是目录列出来的那一份。
415
+ - **「进入场景」先弹一张卡说清会改什么**:新只读 op `scene-mode-preview` 复用引擎里**已有的两个纯计划函数**(`computeMcpPlan` / `computeSkillsPlan`)与同一批现状读取,只把后面的 `apply*` 与 `saveSlice` 去掉 —— 预览与实际执行不可能各说各话。逐方向列出会启停哪些服务器 / 工具 / 技能目录 / 技能 / 人设。预览失败不拦进入:它是说明卡,不是新门禁。
416
+ - **改名留下的悬空引用有地方说了**:新只读 op `state-doctor` + 场景页黄条,把档案与绑定里指向已消失名字的行数出来。这类已经真出过两次(0.9.1 / 0.10.0),而提示词绑定那一连出口都没有 —— 宿主把"绑的预设读不到正文"当成"没绑",界面上那条「预设不存在」标签永远不亮。只数不修:猜着改名字比留着更危险。
417
+ - **记忆页每行带出正文字节数**:记忆是唯一直接吃注入预算的域(场景段 128 KiB),页面上却看不出哪条大。读不到文件时**不带**这个字段、界面什么都不显示 —— 把"不知道"报成 `0 B` 是假话。
418
+ - **「新增 MCP 服务器」弹窗有了备注框**:随表单一起填,留空 = 侧车里不产生任何条目(不是写一条空串)。与服务器同一次写锁落盘(`id` 只有服务端算得出,重名会加后缀);备注写失败不回滚已建好的条目,原因并进 warning。
419
+ - **五处输入加了「字数 / 总字数」**:MCP 备注两处、人设描述、技能描述、记忆描述。分母取的是**注入段的截断长度** —— 不会再出现"界面让你写 500、模型只读到 300"。存量超长的标红。
420
+ - **场景页能搜了**:其余六页早有。匹配卡片上真会显示的四样(目录名 / 显示名 / 一行描述 / 绑定的预设 id);三格统计不跟着过滤变。
421
+ - **`/` 聚焦搜索框、Esc 清空它**:监听挂在插件自己的根节点而不是 `window`(会连宿主的键一起抢);弹窗开着时整条放行。↑/↓/Enter 留在下一步。
422
+
423
+ ### 变更
424
+
425
+ - **预览卡补两行「进入后是什么样」**:`启用 N 台 MCP:…` 与 `启用 N 条记忆:…`。上面那些行说的是"会改什么",什么都不变时 MCP 那一段整段消失,读起来像缺了一块(用户 2026-09-23 指出)。服务器那行由引擎算(场景勾着的 ∩ 配置里存在的);记忆那行在客户端算,判据与记忆页那一行同源(`!shadowed && enabled !== false && 场景 active`),只有一处差别:目标场景按"进入后它就是活动场景"算。公共基线与全局不必写死场景名 —— 服务端给这两者的 `active` 恒为 true。
426
+ - **预览卡的按钮改成两颗**:「先不进入」删掉 —— 它与右上角的「关闭」是同一个动作的两颗按钮;换成「不再显示」= 关掉卡片 + 以后不再弹(也不进入)。恢复的入口是场景页右上角新增的**「关闭提醒 / 开启提醒」**按钮(文字写的是**动作**:正在弹就写「关闭提醒」)。这项设置落在侧车 `scene-settings.json`,**刻意不进场景冻结** —— 它是界面提示,锁着场景的人在场景页照样该能关掉提醒。
427
+ - **预览卡里的技能只显示名字**:键是 `<来源>/<名字>`,而自定义来源的键是一串机器名(`custom-d38da02b873bdb5c/brainstorming`)—— 铺在卡上没人认得出那是哪个技能,现在只取最后一段。
428
+ - **注入实况那三个数改成只数「最近这一段对话」**:投递 / 调用 / 采纳原来是进程级累加,开着 DSH 用一下午之后「注入 8 次 · 从未调用」讲的是"今天这台机器",而人看这块面板问的是"我眼前这一段里模型用没用"。三组计数改挂按会话身份建的账本 —— 身份本来就有(采纳判定的"正文在不在现场"早就按 agent 记),改的只是把计数也挂上去。观测面跟着一起按会话记,`调用 = 0` 该读成"真没用"还是"遥测没接上"也随之变准。
429
+ - **场景描述上限 60 → 300 字**,并删掉「最多 60 字;超出部分在卡片上省略。」:卡片那一行靠 CSS 省略号截,再长也只占一行、撑不高卡片 —— 60 卡的是"能存多少",给的理由说的却是"显示多少",因果对不上。
430
+ - **四个注入上限重新校准**:记忆段 256 KiB → **128 KiB**;技能 / 子智能体 / MCP 三条目录 60 → **50**;MCP 备注 200 → **300** 字。目录对齐在 50 条,横向看体积才有可比性。提示词域未动(64 KiB)。
431
+ - **五张手写门禁清单合成一份 op 登记表**:`WRITE_OPS` / `SENSITIVE_OPS` / 场景冻结 / 档案同步 / 锁定注解各自抄一份 op 名字,中间**没有任何约束** —— 这条纪律历史上失守过四次,而失守的症状从来不是报错,是"没配令牌也能写"或"锁定的场景能被改"。现在 114 个 op 每一个在 `src/op-registry.ts` 登记一条判据,五张清单由它派生;**派生结果与重构前逐条相同**(36 / 2 / 51 / 9 / 5 / 2 / 1,一条不差)。启动时再拿真实 op 表反向对账四个方向,对不上就在兼容页挂一条降级。
432
+ - **注入实况顶部多了成本一行**:「累计约 X · 最费某域 · 重发最多某域」。用"当前正文 × 该域投递次数"估,中途改过内容的话历史那几次不算现在的体积,所以带"约"。纯汇总,不动任何发送文本。
433
+ - **`memory_manager_write` 的描述写清"什么不该记"**:能从代码 / 配置 / git 重新推导的一律不写、建前先查重。execute 里做一次名字与描述的相似比对,命中就在回执后附一行 —— **只说不拦**,猜错一次就把该记的东西记不下去,比多记一条代价大。
434
+ - **`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 工具),我们的工具留着 —— 那正是它被造出来的场景;标准类预设下"读一个被你关掉的技能正文"这种管理动作由面板承担。
435
+ - **`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"),够它认出这条是带人设的委派通道,但"没有人设贴合时才用官方那两个"没了。
436
+
437
+ ### 修复
438
+
439
+ - **自定义技能目录里的技能"列得出、调不动"**:技能页与官方目录都会把 `~/.dsh/skills-SuperWork`(及任何自定义目录)里的技能列给模型,模型照名字去调却拿到 `unknown or no longer available`。根因是 provider 内部两份清单:列表用 `userRoots() + customRootsFromState()`(全集),`getProviderSkill` 却只用 `rootByKey()` —— 后者只看五个静态根,自定义根住在状态文件里恒取不到,于是静默返回"没有这个技能"。补上按 `custom-<hash>` 解析那支。**已用真实数据核验**(修复后取回 6109 / 2260 字正文)。
440
+ - **「采纳」不再把「已清空」通知当成正文**:那句提示写的是"调用发生时正文正在上下文里",代码算的却是"该域在这个会话里说过话" —— 域清空时发的那条通知同样带域标记。结果是**用户把某域关掉之后**模型凭工具描述去调它,照样记一次采纳,第三列其实一直是第二列的复本。建现场集合时按 `form` 挑掉通知条目,并显式移出"正是这一步被清空"的那些域(通知这会儿还没落到会话表面上)。仅遥测判定,不动发送文本与去重键。
441
+ - **预览卡把"没在跑的服务器"报成「停用 N 个工具」**:进入场景的预览卡拿 MCP 停用表的**目标态**与现状逐台比对,而"场景里没勾这台 = 整台停用"在计划里就是一条 `服务器/*` —— 于是 6 台**从来没启用过**的服务器被列成「停用 6 个 MCP 工具:context7/*、fastgraph/* …」(用户实测截图)。服务器没在跑的时候,那张停用表只是记账:记成"整台停用"没有任何可见效果,把它读成"要停用它们的工具"是假话。现在工具级只报**前后都在跑**的服务器(逐工具开关真正起作用的情形),服务器级的改动仍由「停用 N 台服务器」那行如实说。
442
+ - **README 关于子智能体工具那句是错的**:原文写 `_list` / `_run` "依赖宿主挂载 `dsh-subagent-*`,缺席时**不注册**(此时 13 个,界面不提示)"。读代码对不上 —— provider 缺席不影响注册,是 `ensureProvider` 在**调用那一刻**抛「子代理服务未挂载」;而真正的注册失败会逐个记下来,随子智能体页横幅与 `preset-tools` 的 `unavailable` **显示在界面上**。现在按实际写,并说明那四个管理侧工具与 provider 无关。
443
+
444
+ ---
445
+
446
+ ## [0.12.1] - 2026-09-22
447
+
448
+ ### 修复
449
+
450
+ - **子智能体页的人设名不再被挤成两三个字符**:以前名字和描述挤在同一横排里、右边还压着开关和两颗按钮,长名字显示成 `co...`。现在分成两行,名字独占一行、装不下才按省略号截断(悬停看全名)。
451
+
452
+ ### 变更
453
+
454
+ - **客户端类型检查进了门禁**:`typecheck:client` 此前没有任何地方调用,而且是红的。修掉那处错误后并入 `test` 与 `prepublishOnly`。
455
+ - **四个注入上限抬高**:记忆段预算 64 KiB → **256 KiB**;技能目录 50 条 → **60 条**;子智能体 40 条 → **60 条**;MCP 50 条 → **60 条**。描述截断窗口不动(技能与子智能体仍 500 字、MCP 备注仍 200 字)—— 技能这项与官方 `dsh-tool-skill` 的默认值同源,抬成两套会让同一技能在不同预设下长度不一致。提示词域未动。
456
+
457
+ ---
458
+
459
+ ## [0.12.0] - 2026-09-20
460
+
461
+ ### 新增
462
+
463
+ - **兼容页「功能总览」**:一行一个功能点(十几项,第一行是「插件是否完整挂载」),状态由三层合成 —— 装配层(listener / provider / 适配是否真的挂上)+宿主能力层(探测结果)+你自己的配置(开关 / 令牌 / 场景锁定)。取值:正常 / 降级(附原因)/ 未启用 / 受令牌限制 / 部分生效 / 不可用。点一行跳到该功能所在的页签;数据全部来自已有缓存,不新增宿主探测。
464
+ - **停用的 MCP 工具真的从模型可见的工具表里消失了**:`tools.restrict` 之前是在插件级上下文上调的,官方要求 agent scope、必抛 —— 异常被当成"registry race"吞掉,所以「停用」一直只有执行时拦截这一半。现在按 agent 逐个应用(跟随 agent 上线/下线),重新启用后工具会恢复可见。
465
+ - **补丁写入前先做一次解析校验**:复刻官方解析补丁用的 YAML 方言(js-yaml + `!!js` 标签 + 官方那两条断言),写入前判一次产物。判据是**非对称**的 —— 只有"改前能解析、改后不能解析"(=我们的改动把产物弄坏了)才拒绝写入并保留原文件与备份;改前本来就解析不过(说明复刻过期)照写 + 上报;依赖不在也照写 + 上报。校验结论会出现在兼容页,写入回执也带一条 warning。
466
+ - **doctor 新增三项检查**:① 插件运行时按裸模块名要的那几个宿主包(MCP 客户端 / 人设 / AGENTS.md 注入 / 技能目录)是否仍被宿主暴露;② 插件挂载心跳(`tool-management/mount.json`,含 12 个 inject 服务名)—— 官方改名任何一个 inject 服务名时插件根本不会 apply,且官方既不抛错也不打日志,这份心跳是那种情形下唯一的线索;③ 宿主版本与本插件验证过的版本不一致时显式提示。
467
+ - **发行物的 `!!js` 表达式自带兜底**:双挂载判定那段表达式在**每次启动**被宿主求值,而那条调用链没有任何保护;现在表达式自己包了 try/catch,出错返回 false(=不参与判定、保持挂载),绝不把启动流程拖垮。
468
+
469
+ ### 变更
470
+
471
+ - **宿主补上原生删除入口时,先不切换**:单删与批删两条都改为"上报「宿主已提供原生入口」+ 继续走本插件自有完整序列(级联子会话 + spill + 记账 + 缓存行)"。切过去的代码今天不可达,写成即等于它会在官方补上入口的那次升级上首次运行、且无从事前验证。
472
+ - **会话删除的前置检查补齐**:转录清理还要 `readSessionHeader` 与持久化后端的 `locate()`,而它们排在「装写屏障 → flush → detach → 清缓存行」之后 —— 缺任何一个,失败点都会落在中段(转录还在、记账已清)。现在这两项与已有检查一样,在任何破坏性步骤之前先确认。
473
+ - **`@deepseek-ai/cordis` 的 peer 下界提到 `^4.0.2`**(对齐宿主实装);两个子智能体 spawn provider 进 devDependencies(运行时硬 require、此前在本仓库解析不到);移除没有引用的 devDependency `@deepseek-ai/dsh-user-approval`。
474
+ - **依赖投递链写进文档**:`npm run build` 的镜像清单**不含 `node_modules`**,新增的运行时依赖(js-yaml)需要在 profile 侧安装;装不上时校验自动降级为「跳过 + 上报」。
475
+
476
+ ### 修复
477
+
478
+ - **关掉技能 / 提示词域后,官方那条注入真的停了**:此前拦不拦得住取决于启动时的注册先后 —— 没拦住的那次,官方内容照旧进上下文,界面上也看不出异常。现在位置固定,不再看运气。
479
+ - **投影缓存删除屏障的三处缺陷**:① 第三方也包装同一份缓存时,旧屏障退役后仍留在登记表里、被下一次删除复用 → 墓碑拦截静默失效(缓存行可能复活);现在退役即摘出登记表,且复用前先验证包装器确实在岗。② 首次使用抛 `TypeError`(宿主形状变了)时不再把宿主留在"半个包装器"状态下 —— 恢复原方法并上报。③ 安装期(`requireTable()`)抛错时上报,不再只抛一句裸错。
480
+ - **兼容页的删除动作可用性判定与服务端对齐**:此前客户端要求一个可选槽位(`projection.delete-native`),把本机可用的删除显示成不可用;同时服务端运行时真正要求的那条硬前提(投影缓存存储可删行)提升为能力表的正式条目 —— 界面说的和服务端做的从此同一份依据。
481
+ - **兼容页的宿主身份锚点与 doctor 同一套策略**:此前运行时只按"插件自己解析到的包"上溯,dev 布局下会比出假的「同一份模块」,出现"界面说 ok、doctor 说 SEPARATE COPY"。
482
+ - **工作区实体快照写不进去时不再静默**:写入后立刻读回,没写进去就上报(界面上的会话计数可能不刷新)。
483
+ - **几处"只落 console"的装配失败现在出现在兼容页**:技能 provider 装配失败、上下文注入通道装配失败 —— 此前界面看起来一切正常。
484
+ - **关域拦截有了顺序自检**:关域生效期间连续多轮一条都没拦到时会提示"可能没拦到(也可能是官方那几轮本来没内容)"。
485
+
486
+ ---
487
+
488
+ ## [0.11.0] - 2026-09-20
489
+
490
+ ### 新增
491
+
492
+ - **访问令牌可以设置、关闭、修改、删除了**:以前只有「设置」一条路,关掉就等于把配置里的令牌删掉、想再开只能重新输一遍。现在关闭只是"暂时不生效"(令牌留着,随时开回来),新增「修改令牌」与「删除令牌」,状态收成一枚四态胶囊 + 一句实况。
493
+ - **批量启停可以撤销了**:MCP / 技能 / 记忆三处批量开关做完后出现一条不会自动消失的提示,点「撤销」按操作前的状态逐条写回。
494
+ - **兼容页可以清理旧备份了**(页头「刷新」旁边):每份备份都是整份配置的副本、凭据在里面是明文,而自动剪枝只保证每层最多 5 份。逐层级选删除份数,弹窗内二次确认,只删备份、不碰当前配置。
495
+ - **提示词页与子智能体页可以搜了**:按名称 / 描述过滤,无命中说「没有匹配的…」而不是「还没有…」。
496
+ - **兼容体检改为真调一次**:归档 / 解档 / 批量 / 永久删除四个原生入口与会话的 detach / announce,以前只查方法名在不在就判可用;现在各用一个不可能命中的哨兵 id 真调一次,能调通才算数。
497
+ - **令牌开启、本次启动还没解锁时,输入框会锁住**:对话走的是 DSH 自己的会话通路,不经过插件的 HTTP 门禁 —— 此前令牌配了没填照样能聊、五个域的注入照样进上下文。现在这种情况输入框直接锁住并说明去哪填,解锁后立刻恢复。
498
+
499
+ ### 变更
500
+
501
+ - **关闭 / 修改 / 删除令牌都要当场重输一次当前令牌**:解锁过**不算** —— 请求头里那份已验过的凭证对这三个销毁方向一律不作数,否则"能打开界面就能关掉保护 / 换掉凭证"。
502
+ - **令牌面板拆成「访问令牌」与「令牌管理」两块,表单全部搬进弹窗**:前者只管本次启动 —— 一枚状态胶囊 + 解锁框,解锁错误直接顶替状态句显示;后者只管配置文件 —— 设置/修改、保护开关、删除、清除令牌四行静态清单,行名/说明/按钮同形同位。页面上不再有会展开收起的东西;成功 = 弹窗收起 + 状态行更新,失败 = 弹窗不关、错误显示在弹窗内;红色只出现在确认按钮上。
503
+ - **「保护开关」的方向改按"令牌在不在生效"判断**:用环境变量提供令牌的用户以前会把"开着"显示成"开启保护"、找不到关闭入口;配置文件里没有令牌值时「删除令牌」也不再显示(点了是空操作)。「loader 行读不到」的提示也贴到操作区旁 —— 这一态下写配置必被宿主拒绝。
504
+ - **同一类名字的判定口径统一了**:Windows 保留设备名与控制字符一律拒绝;场景名不再接受尾随空格或点(界面与宿主此前各有一套校验、已经分叉)。
505
+ - **目录链接不再被跟随**:链接进来的记忆以前列得出来、开关也能开,却永远注入不进去。
506
+ - **「打开源文件」限定在技能来源与人设目录内**:这个操作把路径交给系统编辑器,以前只校验后缀。
507
+ - **六页搜索改为停手约 200ms 才过滤,列表只在数据或搜索词真变了才重算**:此前每敲一个字就把整份列表过滤排序一遍,而页面上任何一次重渲染(勾一次选、开个弹窗、MCP 每 5 秒轮询)都会再算一遍。
508
+ - **会话批量删除不再逐条重扫全部会话**(原先 O(N × 全部会话),现在这批共用开头取的一次快照);注入通道与记忆列表也不再反复重读同一份索引(按文件 `mtime+size` 指纹缓存,外部改了下一轮照常生效)。
509
+ - **导出加了病态上限**:单文件 32 MB / 合计 256 MB,超了明确报错(不再把"全部正文 + 一份 zip"同时堆在内存里);注定超限的上传在开始读之前就拒掉。
510
+ - **没配访问令牌时,查看明文密钥不再要求令牌**:原先一律拒绝,而那时用户根本没有可填的令牌 —— 点「显示密钥」只有一句"缺少访问令牌",是条死路。有令牌(含"关掉保护")时照旧要带对的。
511
+ - **「注入」设置块不再因为没填令牌而整块消失**:`inject-settings` / `mcpm-settings` 这两个"读改写"op 的**读**不再按写操作门禁(写仍然要令牌)。
512
+
513
+ ### 修复
514
+
515
+ - **打码的密钥不再被「保存」写坏**:编辑弹窗预填的是打码值,以前保存会把它当真值写回补丁文件,真密钥永久丢失。现在保存时用原值顶替、没有原值就跳过并提示。
516
+ - **宿主没配令牌但浏览器里残留旧令牌时,现在有「清除令牌」入口**:以前那一态整行不渲染,残留令牌没有任何出口。
517
+ - **别处触发"去填令牌"时,先收起弹窗再聚焦解锁框**:解锁框在弹窗展开期间是禁用的,直接聚焦会被浏览器吞掉。
518
+ - **「令牌未验证」横幅不再盖住宿主的设置窗口**:层级降到插件弹窗之下,并加了关闭键;关掉后本次锁态期间不再出现,解锁后再锁照常回来。
519
+ - **堵上「清除令牌后仍可对话」的漏洞**:解锁一次后「清除令牌 + 强刷新」,浏览器里已无令牌、对话却畅通 —— pre-step 门禁读的那颗"本次启动已验过"的闩只置位不清零。现在清除令牌会让宿主把闩重新挂上(`token-unaccept`,不进 handlers、模型碰不到;不要求凭证 —— 它只会收紧),必须重新验令牌才能对话;其它标签页内存里的旧令牌同步作废。
520
+ - **编辑 MCP 服务器不再把 URL 里的凭据写成占位串**:URL 查询串是另一种打码形态(`?<redacted>`),现在与 env / headers 同一条规则 —— 没有原值可顶替时拒绝整次保存并提示重填。
521
+ - **「设置宿主令牌」不再可能把 DSH 写坏到起不来**:`config:` 形状识别不了时会插入重复键,而官方解析器对重复键是抛错;现在识别不了就拒绝改写并说明。
522
+ - **记忆索引损坏不再静默清空配置**:以前解析失败被当成"没有索引",下一次写入就把空索引落盘,一次损坏丢掉全部启用集合与排序。现在坏文件留存、拒绝写入并说明怎么办。
523
+ - **开关状态不再莫名回弹或陈旧**:两个开关同时写同一份状态文件会互相抹掉;现在写操作串行执行,并跟随文件的实际改动。
524
+ - **锁定场景正在生效时,不再能通过清空启用集合绕开模型侧的写门禁**。
525
+ - **MCP「重启」中断后不再把服务器留在停用态**(恢复写在 `finally` 里)。
526
+ - **导入文件不再让设置面板变空白**:渲染期抛错把整棵组件树卸载了。
527
+ - **详情弹窗不再被"晚到的响应"搅乱**:连点两条时先发的响应后到会覆盖详情,关窗后晚到的响应还会把它重新打开。
528
+ - **「显示密钥」真的能显示明文了**:以前客户端又打了一次码,解锁后看到的仍是 `sk-1****`。
529
+ - **「令牌没过」的提示统一成一句话**,不再几秒后自己消失,且在任何弹窗里都看得见(此前弹窗里有的什么都不显示、有的没有跳转按钮)。
530
+ - **子代理工具注册失败不再静默**:子智能体页顶部会出黄条说清是哪几个工具、为什么。
531
+ - **读不到的记忆不再"人间蒸发"**:文件被删 / 权限不足 / 被锁时会连名字与原因出现在记忆页的告警条里。
532
+ - **导出会话不再静默覆盖同名文件**(文件名带短哈希区分,撞名如实报 skipped)。
533
+ - **命令行体检(`node scripts/doctor.mjs`)补齐 6 项能力**:删除 / 归档 / 列表路由真正依赖的那些以前不在体检范围,现在 15 项全列。
534
+ - **键盘可达**:导入拖拽区以前是 `div` + `onClick`(Tab 到不了、回车也打不开),现在是真的按钮;工具页签补上页签语义与 ←/→/Home/End 切换。
535
+ - **开了系统的「减少动态效果」后**,开关、拖拽区、注入预算条不再有过渡动画。
536
+ - **批量归档部分失败会在结果里说明**;**人设改名改为原子写入**;**新建 / 导入记忆改为先落索引、再落文件**。
537
+ - **技能 / 子智能体 / 记忆三页现在会显示场景与锁定横幅了**:服务端标了、界面读不到(技能页的字段被响应信封挡掉、子智能体页刷新时漏搬、记忆页压根没渲染)。记忆页的写控件在场景锁定时也因此**从未被禁用**过,一并修好。
538
+ - **场景锁定期间不再显示「改动会同步写进场景档案」那条长提示**:开关都是灰的,那句话没有落点,与锁定横幅并排还互相矛盾。
539
+ - **批量启停的撤销条改成琥珀色**(边框 + 提示句 + 淡底):它是这次批量操作唯一的补救通道,此前与旁边的普通回执长得一样,扫一眼不会注意到。
540
+
541
+ ### 文档
542
+
543
+ - **README 补上此前缺失的边界告知**:场景锁定的具体冻结范围、会话永久删除不进回收站、导出是可读转录不是完整备份、白名单会并回全部 MCP 工具、密钥在磁盘上始终是明文。
544
+
545
+ ---
546
+
547
+ ## [0.10.0] - 2026-09-18
548
+
549
+ ### 新增
550
+
551
+ - **「注入实况」显示每个域的采纳统计**:「注入 N 次 · 调用 M 次 · 采纳 K 次」,勾了开关但模型从没伸手一眼可见;节头并标注本进程观测到的工具调用数,区分「模型没用」与「统计没接上」。
552
+ - **人设可配「目录注入」(`catalogDepth`)**:控制常驻人设目录注入到哪一层会话(默认只在顶层),不限制子代理继续嵌套。
553
+ - **人设子代理支持 `inherit`**:继承本次会话**已完成**的轮次(本轮内委派仍要写全任务);贴合人设的任务从此一律走 `subagent_manager_run`,官方 `subagent` / `subagent_fork` 只在没人设贴合或需要后台任务时用。
554
+ - **人设新增「输出要求」字段(`output:`)**:一行一条硬要求,单独成节写进子代理系统提示词,并约束父代理的 `task` 只给目标与上下文、不规定做法。
555
+
556
+ ### 变更
557
+
558
+ - **注入框架重排为 markdown 四级结构**:`##` 标题 + 加粗动作句前置 + 补充动作行 + 取代声明,五域同一副骨架;场景记忆与子智能体引导语同步重写(给判据、给优先级、补触发条件),正文重复标题与「已清空」通知的插件前缀一并去掉。
559
+ - **提示词注入不再「裸送」**:与其余四域同款框架且整条包进 `<system-reminder>`(正文里的闭合标记会转义),界面显示来源文件与载入状态,模型侧正文带「来源:」行。
560
+ - **关掉「技能」或「提示词」的勾选,官方那条注入一起停**(此前只停本插件自己);其余三域勾选完全生效。
561
+ - **子代理会话不再注入场景记忆**(只在顶层注入),子代理上下文收敛为「角色 + 任务」,需要时用 `memory_manager_*` 自取。
562
+ - **人设进子代理系统提示词时带角色框**:`# 角色:名` 标题 + 授权/边界一行 + `## 角色定义` 围栏,不含 `description`,人设文件本身不用改。
563
+ - **MCP 列表改为全局在前、同级按名排序**,页面、场景档案勾选器与模型侧清单三处同序。
564
+ - **人设目录的注入判据定为「深度 < `catalogDepth`」**;「注入实况」两档状态改称「已注入 / 不在本会话注入」,无正文行不再画展开箭头。
565
+ - **五个管理工具的描述回指上下文里的注入块**,目录与工具互相指路。
566
+ - **全部服务端错误码补齐双语词条**(此前 15 码无词条,英文界面回退中文原文);目录选择器与技能详情 frontmatter 标签同样改走词典。
567
+ - **README 安全段补充**:栅栏降级面、`dir-list` 暴露面、HTTP 状态码以 `body.ok` 为准、裸 API 退出场景不清启用集。
568
+ - **文档更正**:人设「默认停用」(此前写成自动启用)、场景接管期间「应用 = 改绑该场景」(此前写会被拒绝)、「四域开关同步档案」更正为三域(并更正 0.9.1 条目同句)、密钥打码字形改为与实现一致。
569
+ - **六个管理页的启用项排到列表前面**:MCP / 技能 / 子智能体 / 提示词 / 记忆 / 场景,开着的浮在上面、停用后落回原位(两半内部保持原顺序,不是按名重排;提示词页没有开关,按「生效中」排)。拨开关引起的换位有 180ms 过渡,搜索 / 筛选 / 折叠与轮询刷新引起的位移不做动画,「减少动态效果」下直接落位。
570
+
571
+ ### 修复
572
+
573
+ - **兼容页的「访问令牌」块重排**(用户裁定 2026-09-18):块挪到「注入」**上面**(令牌不过时写操作全被拒,是"先解决才能用别的"的一件事);状态胶囊只放**短状态**(未配置 / 未填写 / 已匹配 / 不匹配)——上一版把整句"与宿主配置的令牌不一致……"塞进胶囊,一行里两种字号交错,是这块"很杂乱很丑"的主因;次要操作改成一行 quiet 文本按钮(与 MCP 页那排「详情 / 编辑 / 重启」同款,三个带边框的按钮挤在一起边框互相打断是另一半原因);说明从一整段散文改成**三条短句**(用户原话:写简单简洁一点,用户大致了解就行),版式与「工具能用 ≠ 模型知道」那份清单一致。
574
+ - **「令牌没过」的提示统一成一套文案,并带跳转按钮**(用户裁定 2026-09-18):此前同一件事有四种说法(宿主写门禁、明文门禁两条分支、界面错误码词典各写一套,截图里能同时看到三种),用户无法判断是不是同一件事。现在宿主侧只有 `http-fence.ts` 里的 `TOKEN_MSG_NO_HOST` / `TOKEN_MSG_BAD` 两句(`TOKEN_PANEL_HINT` 拼进去,保证每个出口都指路),界面词典与它们逐字相同;识别按**文本相等**而不是猜关键词("缺少/未配置"这类词出现在别的提示里会误挂按钮)。按钮挂在共享的 `Notice` 组件里一处实现,于是**任意页面**的令牌提示右侧都会出现「填写令牌」——点了切到兼容页并把光标放进输入框(`ToolsSection` 注册切页签、兼容页消费聚焦请求,两条通路都覆盖:已在兼容页 / 刚切过去)。`apply` **之外**的 CompatPage 用不了 `Notice`,按本页写法手工拼同一套。另加一条契约测试钉住"宿主常量与界面词典逐字相同"——不同则按钮静默消失、同一件事又变两种说法。
575
+ - **MCP 详情弹窗里也能看到「显示密钥」被拒的提示**(用户指出):用户是在弹窗里点的按钮,而提示此前只长在弹窗背后 —— 弹窗盖着它,等于没有提示。现在同一份提示面板在页面与弹窗里各渲染一份(`tokenGatePanel()`),弹窗里就贴在「显示密钥」那一节下面。
576
+ - **作用域护栏补上"暂时性死区"这一类**(`test/client-scope.test.mjs`):`detailNode` 里调了写在它下方的 `const tokenGatePanel` —— 首屏不打开弹窗时那条引用不求值,测试全绿,一点「详情」就白屏(本次差点翻车)。判据扩成两条:跨 `apply` 作用域的**组件引用**、以及同函数内**先用后声明 const**(两种引用形态:组件首参与被调函数)。已用真实代码回退验证过判据抓得到(`L2408 用了 tokenGatePanel,但它的声明在 L2430`)。
577
+ - **访问令牌的控制面挪进面板,且只对本次运行有效**(用户裁定 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 才生效,界面用「本次填写 = 已匹配」与「待重启」两处状态如实说清,而不是让人以为点了没反应。
578
+ - **新增静态护栏:`apply` 外面的组件不许引用 `apply` 里面的组件**(`test/client-scope.test.mjs`):这类引用只在 state 有值时才求值 —— 首屏正常、一交互就白屏,且不留任何日志(客户端错误不进宿主日志)。本次「兼容页访问令牌」的第一版正是这么翻的(`CompatPage` 声明在 `apply` 之外,却用了 `apply` 内的 `Notice`,填完令牌点保存即白屏)。判据只查 `createElement(名)` / `h(名)` 的首参,所以不误报:一般化的跨作用域检查会被同名局部变量与参数遮蔽,实测在本文件上能报出 30+ 条假阳性。护栏附一条自检用例,拿一段必然违规的代码喂给同一个判据,避免"没报错"其实等于"没在跑"。
579
+ - **访问令牌有了与页面无关的固定入口**(兼容页「访问令牌」块,用户裁定):此前输入框只长在 MCP 页的服务详情弹窗里,而「缺少或错误的访问令牌」这条错误会出现在**任意**页面 —— 在场景页被拒的用户找不到任何地方能填(实测死路)。现在兼容页显示两枚状态(宿主配置有没有 / 本机浏览器这串对不对)、能填能清,错误文案也直接指向那里;宿主侧新增只读的 `token-status`(只回答"配没配 / 这次带的对不对",**不回令牌本身**),写操作被拒时回 `code: error.token.required`。
580
+ - **打码密钥不再被写回补丁文件**(真实事故):编辑弹窗的密钥框预填的是**打码值**(列表本来就把它打码了),而写入路径原样接受表单内容 —— 于是「打开编辑 → 改个别的字段 → 保存」就把真密钥覆盖成了 `••••••`,且无法找回(本机 `TAVILY_API_KEY` 即如此丢失)。现在保存前按 `src/mcp/secret-guard.ts` 收敛:有原值就用原值顶替(= 这一项没改),没有原值或原值本身已是打码值时**跳过该键**并回一条提示;新增与 JSON 导入走同一套。出口另加结构性断言(`buildInsertBlock`),任何漏过守卫的调用点直接拒绝写入,而不是写一个假值进去。
581
+ - **补丁文件里已存在的打码密钥会被主动报出来**:MCP 列表把它列进告警(`服务器名.键名`),说明真值已丢失、要重新填写 —— 此前这种状态完全隐形,用户只会在下次保存时再撞一次同一个结果。
582
+ - **「显示密钥」解锁后能看到明文了**:客户端此前在详情面板又打了一次码(保留前 4 个字符 + `****`),导致配好访问令牌、`mcpm-reveal` 返回真值之后,界面上显示的仍是 `sk-1****`;同时打码字形与宿主不一致,详情里会出现 `••••****` 这种双重打码。现在打码的**唯一出处是宿主**,客户端不再加工。
583
+ - **编辑弹窗会说明密钥框里是打码值**:明确「直接保存不会改动它们」「要看原文需要点『显示密钥』并填对访问令牌」,避免用户以为真密钥长这样、或者以为保存会改掉它。
584
+ - **场景锁定补齐模型侧**:`mcp_manager_add` / `skill_manager_create` / `memory_manager_write` / `prompt_manager_apply` 四个工具此前绕过守卫,锁定期间仍可调用。
585
+ - **记忆怎么删都进回收站**:形态转换与改名此前直接删旧文件(bundle 连附件一起),现在先入回收站再删。
586
+ - **`mcpm-tools-refresh` 要求令牌**:它会临时启停服务器并写两次补丁,此前漏在写操作门清单外。
587
+ - **子代理结果不再混入思考块**;「没有正文」按收尾原因分档说明,不再一律报「无输出」。
588
+ - **人设正文与名字里的 `{{…}}` 不再让子代理启动失败**。
589
+ - **子会话里调委派工具不再被本插件拦下**(不再向官方传 `maxDepth`,人设列表也不再按深度过滤)。
590
+ - **MCP 状态不再把「连不上」报成「可用」**:可用性只认当前真实注册的工具数;曾连上、当前不可用的如实标注。
591
+ - **场景里手动关掉的技能目录 / MCP 服务器,退出场景后正常还原**(快照全量记录进场景前状态)。
592
+ - **覆盖导入失败自动回滚**;编辑 MCP 服务器保留手写的 `toolCallTimeoutMs`;整台停用时「上次运行时」工具行不再标「已启用」。
593
+ - **场景进行中改 MCP serverName 或人设名,退出场景恢复正常还原**;重启等待窗口内的并发启用不再被快照覆盖。
594
+ - **记忆描述含独立 `---` 行不再截断**(此类多行描述改用引号标量序列化)。
595
+ - **提示词页「应用」失败现在会显示错误**;手工编辑 memories-index.json 的场景描述会触发注入重算。
596
+ - **兼容页「注入实况」的说明不再截断、节头不再错位**;技能页页头按钮窄栏自动收档,「全选」不再折行。
597
+ - **访问令牌比较改为常量时间**(双侧 sha256 + timingSafeEqual)。
598
+ - **测试与开发工具**:补 parseModeState 透传契约断言;client-render 夹具对齐现行响应形状;check-i18n 修复行首键漏对账;`preview-memory-note` / `preview-compat` 修到可跑。
599
+
600
+ ### 移除
601
+
602
+ - `./projcache` 子路径导出与 `lib/history/projcache.js`(archive-manager 时代的投影缓存替换实现,与现行「不插入竞争 provider」的架构冲突,仓库与文档均无引用)。若某个 profile 曾用 `dsh-plugin-tool-management/projcache` 挂载过它,删掉那一行。
603
+
604
+ ---
605
+
606
+ ## [0.9.1] - 2026-09-17
607
+
608
+ ### 新增
609
+
610
+ - **兼容页「注入实况」**:显示最近活跃会话里模型**实际看到**的五域文本,并如实分清「在上下文中 / 未投递 / 官方注入 / 已关闭」——勾了开关却没送到时一眼可见。
611
+ - **「全选」统一成「全选 ↔ 取消全选」二合一**(不再并列两个按钮),并给技能管理页、记忆管理页、记忆的每个场景卡片补上缺的批量开关。
612
+ - **场景未锁定时页面开关照常可用**,改动会同步写进当前场景的档案(MCP / 技能 / 子智能体 / 提示词**三域**的开关同步进档案 —— 记忆域的开关是单一真相源,不经过档案;锁定才冻结)。
613
+ - **人设也严格「退出即还原」**:快照记下进场景时全部人设的开与关,退出逐个恢复。
614
+ - **技能管理页每个来源(目录)卡片也能批量开关**,点它或点来源开关会顺带把卡片展开。
615
+ - **bundle 记忆在列表里显示附件数量**:多一颗「N 个附件」标签(0 个也显示,灰色),悬停给出总量与文件名,点它打开编辑弹窗并跳到附件区。
616
+
617
+ ### 变更
618
+
619
+ - MCP 页的「全部启用 / 全部停用」移到页头动作栏,会话页的「全选」移到「导出会话」旁。
620
+ - 场景横幅与提示词接管提示改口:从「开关已停用、请到档案编辑器里改」改成「改动会同步写进该场景的档案」。
621
+ - 技能目录卡片的「移除来源」改为纯图标按钮(悬停说明后果,点击仍弹确认框)。
622
+
623
+ ### 修复
624
+
625
+ - **退出模式失败、卡在场景里**:项目级技能来源在恢复时解析不到就中断整个退出,现在按 key 前缀解析,且逐行容错、不再因为一行把人困住。
626
+ - **场景内打开技能,档案不跟着变**:同步逻辑读错了开关字段,「打开」被当成「关闭」而跳过写盘;现在按操作名判方向,档案没写成时页面也不再只报「已更新」。
627
+ - **被同名技能覆盖的副本、结构不完整的技能不再进场景档案**:前者档案与运行时各说各话,后者曾让整个场景进不去。
628
+ - **场景档案的 MCP / 技能 / 子智能体段全勾满仍显示「全选」**(没有「取消全选」态);并列的「全选 + 清空」收敛成一个按钮。
629
+ - **按钮文案一变就把整行挤走**:「全选 / 取消全选」与「刷新 / 刷新中…」的宽度改为按较宽的那份固定,八个管理页一致。
630
+ - **点刷新没有「刷新中…」**:MCP / 提示词 / 会话三页的刷新从不立起加载标记,现在手动刷新会真的切过去(后台轮询不算),会话页并补上缺失的失败分支。
631
+ - **MCP 工具描述的「展开」按钮**:改为按真实溢出显示,真被裁到两行才给按钮。
632
+ - **flat 记忆的描述与「已启用」之间空出一段**:窄布局下空标签行不再占位置。
633
+
634
+ ---
635
+
636
+ ## [0.9.0] - 2026-09-16
637
+
638
+ ### 新增
639
+
640
+ - **五个域各有自己的上下文注入**(用户裁定):场景和记忆 / MCP / 技能 / 子智能体 / 提示词各发一条消息、轨迹里各占一行;只改一个域只重发那一条,域被关掉或清空时单独发一条「已清空」。
641
+ - **提示词与技能目录两个新域**:官方那两条行挂得到就让官方送(标准等),挂不到(极简)才由插件兜底,不会出现两份;场景提示词与 `~/.dsh/AGENTS.md` 在官方语义里是同一件事,合并为一个「提示词」域。
642
+ - **兼容页「注入」块**:总开关「极简模式也注入」+ 五个域勾选,设置存 `tool-management/inject-settings.json`。
643
+ - **模型侧信息补全**:技能同名标出 `shadowed by <root>`(被覆盖)与 `preferred`(首选),启用被覆盖的副本不再回 OK 而无效;`skill_manager_list` / `prompt_manager_list` 给出源文件路径;MCP 备注进 `mcp_manager_list` 输出(字段 `user-hint`);未运行的服务器也显示工具描述(按「上次运行时」缓存),超两行默认折叠。
644
+ - **AGENTS.md 预设库记住「最近一次应用」**:手改过全局文件也能答出「来自预设 X(此后文件有变)」,不再退化成全列。
645
+ - **`npm run sync:profile`**:把构建产物镜像进 DSH profile——profile 里是硬链接拷贝,构建新增的文件不会自动过去。
646
+
647
+ ### 变更
648
+
649
+ - **注入不再依赖系统提示词段**(用户裁定):四个域从 `systemPrompt.section()` 改走官方自己用的那条通道(`agent/pre-step` 合成消息)——persona `complete` 的预设(极简)再也压不掉;内容没变不重发,引导语压成一句。
650
+ - **域名与顺序**:`记忆` → **场景和记忆**、`全局提示词` → **提示词**;从左到右 **场景和记忆 → MCP → 技能 → 子智能体 → 提示词**(注入块、可达矩阵、注入消息三处一致)。
651
+ - **兼容页「预设注入边界」与页脚重写**:页脚区分「可调用 ≠ 已知晓」——工具任何预设下都可调用,但呈现由预设决定(`ptc` 会把工具编成生成 SDK,要在 `run_code` 里调)。
652
+ - **破坏性**:四个工具族改名——`agentsmd_*` → `prompt_manager_*`、`rule_manager_*` → `memory_manager_*`、`skill_mcp_manager_*` → `mcp_manager_*`、`subagent_list/run` → `subagent_manager_list/run`;提示词或工作流里点名过旧名的一起改。
653
+ - **插件文件全部收进 `tool-management/` 并按域改名**(`agents-md/` → `prompts/`、`agents/` → `subagents/`、`rules-index.json` → `memories-index.json`、`state.json` → `skills-state.json` 等),启动时自动迁移(只搬不删、绝不覆盖)。
654
+ - **四个列表工具默认只列生效条目**(各带 `all=true` 看全量,表头给出全量口径);工具描述精简 37%。
655
+ - **MCP 详情页运行状态改成标题右侧的彩色标签**;备注的模型侧前缀统一为「用户提示:」。
656
+ - **场景记忆段排版重做**:场景上提到 `##`、条目挂在各自场景下;名称恒为标题、显式描述进括号;bundle 补一行附件目录与文件名;正文文件 `SKILL.md` → `<名>.md`(旧名只读兼容,不迁移)。
657
+
658
+ ### 修复
659
+
660
+ - **子智能体人设弹窗三个毛病一起修**:候选不自动拉、已启用模式的名单进不去、「关闭」后再「启动」清空勾选;现在自动展开也拉候选,**点行首即可展开 / 收起名单**,右侧按钮只管启用 / 停用,停用后再启用记得勾选。
661
+ - **「预设注入边界」三处口径纠正**:子智能体列答「人设目录到不到得了模型」;技能 / 提示词列以官方为准(官方那条行挂着就是绿的);MCP 列按提示词平面作答(被压制即红框)。
662
+ - **每个场景块恒有一行加粗的「场景说明:」**(未填描述给默认句)。
663
+ - **场景内的开关统一收归档案**(四域同口径,模型工具同样拒绝);改档案立即生效、失败如实回报。
664
+ - **人设域与 MCP / 技能进场景按档案勾选集全量对齐**(整段未定义 = 全部停用),退出按快照双向还原。
665
+ - **场景接管提示词时四条状态共用一套事实**:只有场景绑定的那份可「重新应用」;删除保护扩成引用清单;文件被手改时两页都标出「文件里不是它」。
666
+ - **场景退出后 MCP 行「开关已关、进程已停、却仍显示已运行」**:补丁说停用即不可能在运行,显示跟着控制面走。
667
+ - **「N 个工具」不再把停用工具算进去**(有停用时显示 `可用/总数`);工具全被停用的服务器不进段。
668
+ - **场景名与记忆名相同会「吃掉」整个场景**:统一为「根下的一级目录恒为场景」(发现 / 定位 / 导入三处)。
669
+ - **进场景被关掉的人设,退出没开回来**:快照名单落盘读回时被剥掉,现在原样透传。
670
+ - **未启用的场景不再整片标红**:记忆页里「场景未启用」此前与真问题(游离记忆、被同名覆盖)共用同一个错误色,整块红读起来像出了错;现在未启用 = 灰色置灰(标签同色),红色只留给真问题——场景页与档案编辑器里的「未启用」标签同步改灰。
671
+ - **小项**:注入边界提示不再点名工具(此前让模型去用刚用过的工具);`skill_manager_list` 修影子技能误报停用;删 `subagent_manager_list` 空参数 `scene`、修 `create_skill` 老文案。
672
+
673
+ ---
674
+
675
+ ## [0.8.5] - 2026-09-16
676
+
677
+ ### 新增
678
+
679
+ - 场景级 MCP 服务器备注:场景档案的 MCP 段可为每台勾选的服务器写专属备注,进入该场景时覆盖全局备注(写入 notes.json),退出场景时按快照恢复改动前的备注;未配场景备注的服务器照常使用全局备注。
680
+ - 未运行服务器的工具可见性:新增「已知工具」侧车(`dsh-plugin-tool-management-mcp-tools.json`),枚举到 live 工具时按服务器记下名单——未运行的服务器不再永远显示 0 工具,工具勾选框也能列出最后一次见过的工具。从未运行过的服务器可在编辑弹窗点「启动服务器读取工具」:临时启用、轮询等工具注册(≤30s)、记入名单后恢复原启停状态。
681
+
682
+ ### 变更
683
+
684
+ - 新增技能 / 子智能体 / MCP 一律默认不启动(用户裁定,三域同口径):新建与导入的技能显式写入停用名单;新建/导入/回收站恢复的人设默认停用;新增 MCP 服务器创建即停用(显式传 `enabled: true` 才创建即启动)。启动与否由用户手动开启。
685
+ - 场景档案 MCP「编辑」弹窗重做:行内备注输入框移除,「选工具」改为「编辑」,点击打开固定尺寸次级弹窗——第一栏备注、第二栏工具勾选(含全选/清空),有备注的服务器行显示「有备注」标签。
686
+ - 系统提示词注入段文案优化:子智能体人设段措辞改为「可从下面的人设中选用」(此前读起来像"只能调用这几个"),并补充委派机制说明;场景记忆段标题下加固定引导语,让模型明确这是当前场景的常驻参考知识;MCP 备注前缀由「用户备注:」统一为「备注:」。
687
+ - peer 依赖去掉 semver 上界(`>=0.1.5-rc.2 <0.2.0-0` → `>=0.1.5-rc.2`):宿主跨 minor 升级不再被 pnpm peer 校验挡住安装,兼容性改由运行时能力探测兜底。
688
+
689
+ ### 修复
690
+
691
+ - 历史页「已移除」标签红灰两色统一为灰色:此前红色 = 从未登记、灰色 = 曾登记被移除,颜色区分无实际意义。
692
+ - 目录真实存在但没有「重新登记」按钮:`canRegister` 判定从「宿主会话索引命中」放宽为「磁盘目录真实存在」(带 stat 缓存,同一目录只探一次盘),与 `registerWorkspace` 的 realpath 目录校验一致——目录在即可一键重新登记;目录已删除的组显示「⚠ 目录已不存在」提示。
693
+ - MCP 状态段缓存不刷新:MCP 工具加载完成(`tools/change`)与进/退/切换场景后均主动重算状态段——此前段停留在「空/旧集合」的缓存值,出现「切换 MCP 后系统提示词没有 MCP 段」「退出场景后备注看似没恢复」的现象。
694
+ - 退出场景备注永不回退:rules-index.json 读盘时的快照规范化按白名单解析,漏掉了 `snapshot.mcpNotes`——进入时拍下的恢复名单一读回来就被剥掉,退出模式拿不到名单、备注永远停在场景值。现已透传该字段(并补进入覆盖/退出恢复/未勾选不触碰三条直证回归测试;未勾选服务器的场景备注不再在进入时覆盖其全局备注)。
695
+
696
+ ### 说明
697
+
698
+ - 人设"文件缺失 = 全部启用"的老数据兼容语义保留:只有首次新建/导入/恢复时物化现状并排除新名;已有技能与人设的启用状态不动。
699
+
700
+ ---
701
+
702
+ ## [0.8.0] - 2026-09-15
703
+
704
+ ### 新增
705
+
706
+ - 场景锁定:锁定后 MCP / 技能 / 子智能体 / 记忆 / 提示词五个域整体只读;未启动不能上锁,锁定中不能关闭或切换,先解锁再改。
707
+ - 子智能体开关:停用的人设不注入上下文、模型不可见(文件不动);新建 / 导入 / 回收站恢复的人设自动启用,首次升级全部启用。
708
+ - 场景联动:启动场景时档案勾选的子智能体自动启用,退出按快照精确停回。
709
+ - 子智能体人设目录进入系统提示词:只列名字 + 描述,正文仅在委派时传给子代理。
710
+ - MCP 服务器状态与用户备注进入系统提示词:只列当前真正可用的 server,备注作为决策提示带给模型。
711
+ - 四个管理域补上导出(技能 / 子智能体 / 提示词 / 记忆):勾选条目打包 zip 写到指定目录,只读源文件。
712
+ - 提示词预设支持描述:只显示在插件界面,不写进 AGENTS.md。
713
+
714
+ ### 变更
715
+
716
+ - 导出弹窗重做:固定宽高、默认不勾选、条目分组折叠(技能按来源文件夹、记忆按场景、会话按工作区目录),组内同名条目全部展示。
717
+ - 导入入口统一:提示词补上与技能页同源的导入弹窗;四个导入弹窗一律用「文件要求」清单。
718
+ - 删除场景不再要求先清空:连它下面的全部记忆一起进同一条回收站条目,恢复按原路径整条放回;使用中的场景仍拒绝删除。
719
+ - 场景名与人设名可以改了:改名连带目录与档案绑定同步;保留场景、重名、正在使用的场景明确拒绝。
720
+ - 场景开关成为唯一入口:打开 = 进入场景(应用档案 + 启用),关闭 = 恢复全局默认;「退出模式」与开关走同一条路径。
721
+ - 记忆改为单一真相源 `enabled`:档案弹窗的勾选就是记忆自身的开关;新建与导入的记忆默认不开启。
722
+ - 提示词「应用」生效时机口径修正:下一轮对话即生效(宿主每轮重读 AGENTS.md),不再说「新会话生效」。
723
+ - 技能回收站弹窗重做:上下两块(目录 / 技能)各占一半、各自滚动,两组的后果差异写进界面;入口移到工具栏。
724
+ - MCP 新增默认级别改为全局;「Profile 级」更名「应用级」,级别下拉全局在上。
725
+ - 界面统一化:按钮四级语义、列表类弹窗固定尺寸且只允许列表层滚动、工具栏顺序固定、命名统一「新增 / 导入 / 导出 + 页名」;提示词 / 子智能体页补统计行。
726
+ - 备注输入框加 200 字上限,备注标签如实说明(会随请求发送给模型)。
727
+
728
+ ### 修复
729
+
730
+ - 进 / 退模式报 EPERM 且开关要点两次:索引与技能管理状态的原子写遇文件占用(EPERM/EACCES/EBUSY)自动重试。
731
+ - 退出场景模式后 MCP 服务器级与技能目录不回滚:快照的服务器级 / 来源级名单在读盘时被剥掉,现在原样保留。
732
+ - 列表类弹窗条目多时看不到滚动条:列表组被 flex 收缩后条目直接被裁掉;现在列表层正常滚动并带常驻细滚动条。
733
+ - 顶部「当前模式」横幅永远不显示:开关与按钮各写一个状态、互不同步,现在两者恒等。
734
+ - 长文本排版错位与截断丢失:标题截断补齐并加 `title` 提示。
735
+ - 历史页两个工作区分组标签区分无实际意义,统一为「已移除」。
736
+ - 兼容页把 semver 上界当受支持版本展示。
737
+ - 清理 CSS 死规则、未定义类名与 i18n 死键;滚动容器改为向上查找。
738
+
739
+ ### 移除
740
+
741
+ - 「切入此模式」按钮(开关承担)。
742
+ - 场景档案的 `memories` 段:老档案里的该字段被忽略,不做自动迁移。
743
+ - `memoryAllowed` / `computeMemoriesPlan`(单一真相源后不再需要)。
744
+
745
+ ### 说明
746
+
747
+ - 新建记忆默认不开启是行为变更:已有记忆的 `enabled` 原样保留,不受影响。
748
+ - 老数据里 `mode.scene` 与 `active` 可能不一致:不做一次性迁移,下次拨动任一场景开关时自然对齐。
749
+
750
+ ## [0.7.0] - 2026-09-15
751
+
752
+ ### 新增
753
+
754
+ - 回收站扩到子智能体 / 场景 / 提示词预设三处:删除都进回收站,可恢复或永久删除(恢复绝不覆盖)。
755
+ - 子智能体工具限制改为按 Agent 预设:每个预设一份白/黑名单(互相排斥),运行期按当前预设生效。
756
+ - 兼容页「预设注入边界」改版:五列标签(记忆 / 提示词 / 技能 / MCP / 子智能体),绿/红/灰框一眼看出哪个域被预设关掉。
757
+
758
+ ### 变更
759
+
760
+ - 已移除的来源并入回收站(分目录/技能两部分,目录支持永久删除)。
761
+ - 五处回收站排版统一(固定高度容器、行内边距收紧)。
762
+ - MCP「整理补丁」重新上线:删多余启停覆盖块(生效状态不变),界面只留一个按钮。
763
+
764
+ ### 修复
765
+
766
+ - 技能页「移除来源 / 恢复读取」死按钮:补客户端 op 映射 + 补进 writeOps 门禁清单。
767
+ - `rules-toggle` 不传 `enabled` 时静默 no-op 却返回成功:改为缺参明确拒绝、不写盘。
768
+ - 场景档案「技能集」把来源 key 当技能名显示:改为技能名与来源名分开回传,不再显示 `custom-<hash>`。
769
+
770
+ ### 安全
771
+
772
+ - 明文密钥改为一律要令牌:「显示密钥」与配置导出没配 `token` 时一律拒绝,不再只靠宿主栅栏。
773
+
774
+ ---
775
+
776
+ ## [0.6.0] - 2026-09-14
777
+
778
+ ### 新增
779
+
780
+ - 「工具 → 兼容」页(第 8 个页签,只读):宿主版本、能力可用数、每个动作走原生/适配/不可用、降级项与原因。
781
+ - `node scripts/doctor.mjs`:命令行版兼容体检。
782
+ - `node scripts/host-deps.mjs --fix/--restore`:把插件依赖 junction 到宿主安装。
783
+ - 归档分组可重建:工作区登记被删后按会话目录自动重建,可一键重新登记。
784
+ - 恢复归档顺带挂回工作区归属(此前会掉进「未分组」)。
785
+ - 场景可绑定提示词预设;切换场景直接改写 `~/.dsh/AGENTS.md`(关掉自动恢复基线)。
786
+ - 提示词预设库:新建即可写正文、编辑可改 id(= 目录改名,场景绑定自动跟着改)。
787
+ - 正在生效的提示词预设不能删除。
788
+ - 场景启用改单选(同时只启用一个,新场景默认不启动)。
789
+
790
+ ### 变更
791
+
792
+ - 兼容判定换底座:源码文本比对 → 模块实体 + 能力探测;拒绝永远在写入之前。
793
+ - 技能来源权限语义修正:默认来源必须读取但技能可删;外部目录可停用/移除但技能只读。
794
+ - 用户数据搬出插件目录(归档账本等移入 hub)。
795
+ - 归档服务改为独立门面:`cordis.patch.yml` 只插入本插件。
796
+ - 弹窗按钮统一(取消/关闭只在右上角)。
797
+ - 面板语言跟随宿主;会话页与 AGENTS.md 页接入中英词典。
798
+ - AGENTS.md 应用保留 5 代备份。
799
+ - 提示词预设 id 口径放宽(中文、空格等可用)。
800
+ - `history-retention-set` 拒绝小数;`rules-set-active` 必须显式传参;`mcpm-set-enabled` 停用幂等。
801
+ - 写操作门禁:先过宿主栅栏,`token` 作为脚本/局域网逃生门。
802
+
803
+ ### 修复
804
+
805
+ - 进出场景模式会静默改写技能策略(数据污染):快照只取生效项,已处于目标状态的不再写。
806
+ - 导入技能删进回收站拿不回来:按作用域分岔,用户级来源按 key 重新解析路径。
807
+ - 技能回收站显示字面量 `undefined`。
808
+ - 面板不随宿主语言切换、两页硬编码中文、词条键写错导致界面露原始键名。
809
+ - `subagent_manager_run` 确认门早于参数校验:人设不存在时不再先弹卡。
810
+ - 删除链路前置实现检查:在任何破坏性步骤之前校验所需方法。
811
+ - 英文界面下兼容页结论条仍是中文:改为客户端按当前语言拼。
812
+ - 两处过时文案(AGENTS.md 应用说明、创建技能确认卡落点)。
813
+
814
+ ### 安全
815
+
816
+ - `mcpm-reveal` / `mcpm-export` 额外要求带 `Origin` 头。
817
+ - `history-workspace-register` 补入 WRITE_OPS(此前漏了 token 门禁)。
818
+
819
+ ---
820
+
821
+ ## [0.5.1] - 2026-09-13
822
+
823
+ ### 新增
824
+
825
+ - 场景档案弹窗新加段默认一项都不勾:记忆段只预勾本场景已启用的,其余三段是空集。
826
+
827
+ ### 变更
828
+
829
+ - 档案弹窗「记忆」段只列被编辑场景自己的记忆。
830
+ - 场景页排版重做:卡片只留名字+描述+动作,数量收进页首「当前模式」条。
831
+ - 保留场景「全局」不再出现在场景页与档案弹窗。
832
+
833
+ ---
834
+
835
+ ## [0.5.0] - 2026-09-13
836
+
837
+ ### 新增
838
+
839
+ - 插件自有技能来源「导入技能」(新建/导入落点,优先级高于 `~/.dsh/skills/`)。
840
+ - 「移除来源」= 连目录都不再扫描(文件零改动,可恢复)。
841
+ - 场景档案编辑器新增第 4 段「记忆」。
842
+ - 人设模型与工具限制收进「高级选项」折叠区。
843
+
844
+ ### 变更
845
+
846
+ - **破坏性**:插件产生的文件全部收进 `~/.dsh/tool-management/`(旧位置自动搬入)。
847
+ - 场景升级为显式记录(带描述与顺序);空场景合法;根层裸 `.md` 不再注入。
848
+ - 斜杠命令全部下线。
849
+
850
+ ### 修复
851
+
852
+ - 工具页整页白屏(`sceneLabel` 闭包作用域错)。
853
+ - 导出静默丢失(导出写在 `apply` 体内)。
854
+ - Skills 页被锁死(状态文件缺键被判非法 → 改为缺键自愈)。
855
+
856
+ ---
857
+
858
+ ## [0.2.0] - 2026-09-12
859
+
860
+ ### 新增
861
+
862
+ - 五个域合并进一个「工具」设置面板:MCP / Skills / AGENTS.md 预设 / History。
863
+ - MCP:工具级独立启停、重启只重连不改启停、密钥默认打码、改写补丁前自动 `.bak`(保留 5 份)。
864
+ - Skills:接入 `~/.agents` / `~/.codex` / `~/.claude` 与自定义目录;创建 / ZIP 导入 / 回收站;目录后台监听自动刷新。
865
+ - AGENTS.md 预设库:多套全局基线,一键应用。
866
+ - History:归档会话按项目分组、批量恢复 / 删除、保留期清理;从 Claude Code / Cursor / Codex / 任意文本导入;导出 Markdown / JSONL。
867
+
868
+ > 0.1.1 / 0.1.2 / 0.1.3 没有独立记录(只有 git tag),此处不拆分它们的差异。