dsh-plugin-tool-management 0.12.0 → 0.13.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.
- package/CHANGELOG.md +52 -0
- package/README.md +11 -3
- package/README_EN.md +9 -3
- package/docs/update.md +46 -0
- package/lib/client.js +602 -51
- package/lib/context-inject.js +98 -28
- package/lib/index.js +305 -12
- package/lib/mcp/manager.js +115 -57
- package/lib/mcp/state-section.js +5 -2
- package/lib/memories/archive-engine.js +199 -0
- package/lib/memories/constants.js +1 -1
- package/lib/memories/snapshot.js +10 -0
- package/lib/op-registry.js +273 -0
- package/lib/ops/compat.js +15 -2
- package/lib/ops/state-doctor.js +115 -0
- package/lib/request-gate.js +21 -78
- package/lib/scene-settings.js +17 -0
- package/lib/skills/catalog.js +9 -4
- package/lib/skills/core.js +9 -0
- package/lib/subagents/catalog.js +9 -5
- package/lib/subagents/tools.js +9 -2
- package/lib/tools/mcp.js +3 -3
- package/lib/tools/memory.js +105 -5
- package/lib/tools/prompt.js +2 -2
- package/lib/tools/skills.js +81 -3
- package/lib/tools/subagent.js +117 -2
- package/lib/tools/table.js +101 -0
- package/package.json +108 -108
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,58 @@
|
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
+
## [0.13.0] - 2026-09-23
|
|
14
|
+
|
|
15
|
+
### 新增
|
|
16
|
+
|
|
17
|
+
- **模型侧补五个工具,15 → 20**:`memory_manager_set_enabled` / `_update`、`subagent_manager_set_enabled` / `_create` / `_update`。分布此前是歪的 —— 技能与 MCP 两域模型能启停能新建,记忆与子智能体却**只读**:看得到一份记忆、看得到一个人设,开关拨不了、内容改不了,只能回一句"请到界面上点"。底层那五个 op 连门禁(写令牌 / 场景冻结 / 档案同步)都齐,缺的只是接线。提示词按裁定只留 `apply`。
|
|
18
|
+
- **所有会改东西的工具都写明"要用户开口或先同意"**:启停类一句 `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` 说明了四遍。
|
|
19
|
+
- **模型工具表可以关**:工具表**每一轮请求都随工具发一遍**,20 个工具的整份定义合计 ≈3,450 tok(宿主口径:整份 JSON 除 4),这一轮用不上也照付。兼容页新增「模型工具表」块,逐个工具勾选、按域全开全关,关掉的**整份不进请求** —— 只把描述写短是重编码同样的事实,这才是唯一真省钱的杠杆(实测:关掉 6 个管理类工具省 ≈1,115 tok/轮)。数字全部来自**注册时量到的整份定义体积**,界面上的 ≈ 与分组合计同一个来源,默认一个都不关。配套两处:关掉的工具在**执行侧**也拦住(可见性那半边万一没生效,名字也不该被执行),注入文本里点名它的那几句跟着换话术(技能 / 子智能体目录的截断提示与两条 `how` 行)—— 点名一个模型手里没有的工具,只会让它去猜名字。**面板不受影响**:114 个 op 与工具表互不相干,关掉 `mcp_manager_add` 之后 MCP 页照样能加服务器。
|
|
20
|
+
- **`skill_manager_read`**:按名字一次拿到技能正文。此前要两步(`skill_manager_list` 取路径 → 自己读那个文件),而目录只有名字没有路径、同名常几份并存,自己挑路径很容易读到被覆盖的影子副本 —— 读完以为在用这个技能,其实生效的是另一份。新工具先走 `skill-state` 的胜出者判定再读,读到的就是目录列出来的那一份。
|
|
21
|
+
- **「进入场景」先弹一张卡说清会改什么**:新只读 op `scene-mode-preview` 复用引擎里**已有的两个纯计划函数**(`computeMcpPlan` / `computeSkillsPlan`)与同一批现状读取,只把后面的 `apply*` 与 `saveSlice` 去掉 —— 预览与实际执行不可能各说各话。逐方向列出会启停哪些服务器 / 工具 / 技能目录 / 技能 / 人设。预览失败不拦进入:它是说明卡,不是新门禁。
|
|
22
|
+
- **改名留下的悬空引用有地方说了**:新只读 op `state-doctor` + 场景页黄条,把档案与绑定里指向已消失名字的行数出来。这类已经真出过两次(0.9.1 / 0.10.0),而提示词绑定那一连出口都没有 —— 宿主把"绑的预设读不到正文"当成"没绑",界面上那条「预设不存在」标签永远不亮。只数不修:猜着改名字比留着更危险。
|
|
23
|
+
- **记忆页每行带出正文字节数**:记忆是唯一直接吃注入预算的域(场景段 128 KiB),页面上却看不出哪条大。读不到文件时**不带**这个字段、界面什么都不显示 —— 把"不知道"报成 `0 B` 是假话。
|
|
24
|
+
- **「新增 MCP 服务器」弹窗有了备注框**:随表单一起填,留空 = 侧车里不产生任何条目(不是写一条空串)。与服务器同一次写锁落盘(`id` 只有服务端算得出,重名会加后缀);备注写失败不回滚已建好的条目,原因并进 warning。
|
|
25
|
+
- **五处输入加了「字数 / 总字数」**:MCP 备注两处、人设描述、技能描述、记忆描述。分母取的是**注入段的截断长度** —— 不会再出现"界面让你写 500、模型只读到 300"。存量超长的标红。
|
|
26
|
+
- **场景页能搜了**:其余六页早有。匹配卡片上真会显示的四样(目录名 / 显示名 / 一行描述 / 绑定的预设 id);三格统计不跟着过滤变。
|
|
27
|
+
- **`/` 聚焦搜索框、Esc 清空它**:监听挂在插件自己的根节点而不是 `window`(会连宿主的键一起抢);弹窗开着时整条放行。↑/↓/Enter 留在下一步。
|
|
28
|
+
|
|
29
|
+
### 变更
|
|
30
|
+
|
|
31
|
+
- **预览卡补两行「进入后是什么样」**:`启用 N 台 MCP:…` 与 `启用 N 条记忆:…`。上面那些行说的是"会改什么",什么都不变时 MCP 那一段整段消失,读起来像缺了一块(用户 2026-09-23 指出)。服务器那行由引擎算(场景勾着的 ∩ 配置里存在的);记忆那行在客户端算,判据与记忆页那一行同源(`!shadowed && enabled !== false && 场景 active`),只有一处差别:目标场景按"进入后它就是活动场景"算。公共基线与全局不必写死场景名 —— 服务端给这两者的 `active` 恒为 true。
|
|
32
|
+
- **预览卡的按钮改成两颗**:「先不进入」删掉 —— 它与右上角的「关闭」是同一个动作的两颗按钮;换成「不再显示」= 关掉卡片 + 以后不再弹(也不进入)。恢复的入口是场景页右上角新增的**「关闭提醒 / 开启提醒」**按钮(文字写的是**动作**:正在弹就写「关闭提醒」)。这项设置落在侧车 `scene-settings.json`,**刻意不进场景冻结** —— 它是界面提示,锁着场景的人在场景页照样该能关掉提醒。
|
|
33
|
+
- **预览卡里的技能只显示名字**:键是 `<来源>/<名字>`,而自定义来源的键是一串机器名(`custom-d38da02b873bdb5c/brainstorming`)—— 铺在卡上没人认得出那是哪个技能,现在只取最后一段。
|
|
34
|
+
- **注入实况那三个数改成只数「最近这一段对话」**:投递 / 调用 / 采纳原来是进程级累加,开着 DSH 用一下午之后「注入 8 次 · 从未调用」讲的是"今天这台机器",而人看这块面板问的是"我眼前这一段里模型用没用"。三组计数改挂按会话身份建的账本 —— 身份本来就有(采纳判定的"正文在不在现场"早就按 agent 记),改的只是把计数也挂上去。观测面跟着一起按会话记,`调用 = 0` 该读成"真没用"还是"遥测没接上"也随之变准。
|
|
35
|
+
- **场景描述上限 60 → 300 字**,并删掉「最多 60 字;超出部分在卡片上省略。」:卡片那一行靠 CSS 省略号截,再长也只占一行、撑不高卡片 —— 60 卡的是"能存多少",给的理由说的却是"显示多少",因果对不上。
|
|
36
|
+
- **四个注入上限重新校准**:记忆段 256 KiB → **128 KiB**;技能 / 子智能体 / MCP 三条目录 60 → **50**;MCP 备注 200 → **300** 字。目录对齐在 50 条,横向看体积才有可比性。提示词域未动(64 KiB)。
|
|
37
|
+
- **五张手写门禁清单合成一份 op 登记表**:`WRITE_OPS` / `SENSITIVE_OPS` / 场景冻结 / 档案同步 / 锁定注解各自抄一份 op 名字,中间**没有任何约束** —— 这条纪律历史上失守过四次,而失守的症状从来不是报错,是"没配令牌也能写"或"锁定的场景能被改"。现在 114 个 op 每一个在 `src/op-registry.ts` 登记一条判据,五张清单由它派生;**派生结果与重构前逐条相同**(36 / 2 / 51 / 9 / 5 / 2 / 1,一条不差)。启动时再拿真实 op 表反向对账四个方向,对不上就在兼容页挂一条降级。
|
|
38
|
+
- **注入实况顶部多了成本一行**:「累计约 X · 最费某域 · 重发最多某域」。用"当前正文 × 该域投递次数"估,中途改过内容的话历史那几次不算现在的体积,所以带"约"。纯汇总,不动任何发送文本。
|
|
39
|
+
- **`memory_manager_write` 的描述写清"什么不该记"**:能从代码 / 配置 / git 重新推导的一律不写、建前先查重。execute 里做一次名字与描述的相似比对,命中就在回执后附一行 —— **只说不拦**,猜错一次就把该记的东西记不下去,比多记一条代价大。
|
|
40
|
+
- **`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 工具),我们的工具留着 —— 那正是它被造出来的场景;标准类预设下"读一个被你关掉的技能正文"这种管理动作由面板承担。
|
|
41
|
+
- **`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"),够它认出这条是带人设的委派通道,但"没有人设贴合时才用官方那两个"没了。
|
|
42
|
+
|
|
43
|
+
### 修复
|
|
44
|
+
|
|
45
|
+
- **自定义技能目录里的技能"列得出、调不动"**:技能页与官方目录都会把 `~/.dsh/skills-SuperWork`(及任何自定义目录)里的技能列给模型,模型照名字去调却拿到 `unknown or no longer available`。根因是 provider 内部两份清单:列表用 `userRoots() + customRootsFromState()`(全集),`getProviderSkill` 却只用 `rootByKey()` —— 后者只看五个静态根,自定义根住在状态文件里恒取不到,于是静默返回"没有这个技能"。补上按 `custom-<hash>` 解析那支。**已用真实数据核验**(修复后取回 6109 / 2260 字正文)。
|
|
46
|
+
- **「采纳」不再把「已清空」通知当成正文**:那句提示写的是"调用发生时正文正在上下文里",代码算的却是"该域在这个会话里说过话" —— 域清空时发的那条通知同样带域标记。结果是**用户把某域关掉之后**模型凭工具描述去调它,照样记一次采纳,第三列其实一直是第二列的复本。建现场集合时按 `form` 挑掉通知条目,并显式移出"正是这一步被清空"的那些域(通知这会儿还没落到会话表面上)。仅遥测判定,不动发送文本与去重键。
|
|
47
|
+
- **预览卡把"没在跑的服务器"报成「停用 N 个工具」**:进入场景的预览卡拿 MCP 停用表的**目标态**与现状逐台比对,而"场景里没勾这台 = 整台停用"在计划里就是一条 `服务器/*` —— 于是 6 台**从来没启用过**的服务器被列成「停用 6 个 MCP 工具:context7/*、fastgraph/* …」(用户实测截图)。服务器没在跑的时候,那张停用表只是记账:记成"整台停用"没有任何可见效果,把它读成"要停用它们的工具"是假话。现在工具级只报**前后都在跑**的服务器(逐工具开关真正起作用的情形),服务器级的改动仍由「停用 N 台服务器」那行如实说。
|
|
48
|
+
- **README 关于子智能体工具那句是错的**:原文写 `_list` / `_run` "依赖宿主挂载 `dsh-subagent-*`,缺席时**不注册**(此时 13 个,界面不提示)"。读代码对不上 —— provider 缺席不影响注册,是 `ensureProvider` 在**调用那一刻**抛「子代理服务未挂载」;而真正的注册失败会逐个记下来,随子智能体页横幅与 `preset-tools` 的 `unavailable` **显示在界面上**。现在按实际写,并说明那四个管理侧工具与 provider 无关。
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## [0.12.1] - 2026-09-22
|
|
53
|
+
|
|
54
|
+
### 修复
|
|
55
|
+
|
|
56
|
+
- **子智能体页的人设名不再被挤成两三个字符**:以前名字和描述挤在同一横排里、右边还压着开关和两颗按钮,长名字显示成 `co...`。现在分成两行,名字独占一行、装不下才按省略号截断(悬停看全名)。
|
|
57
|
+
|
|
58
|
+
### 变更
|
|
59
|
+
|
|
60
|
+
- **客户端类型检查进了门禁**:`typecheck:client` 此前没有任何地方调用,而且是红的。修掉那处错误后并入 `test` 与 `prepublishOnly`。
|
|
61
|
+
- **四个注入上限抬高**:记忆段预算 64 KiB → **256 KiB**;技能目录 50 条 → **60 条**;子智能体 40 条 → **60 条**;MCP 50 条 → **60 条**。描述截断窗口不动(技能与子智能体仍 500 字、MCP 备注仍 200 字)—— 技能这项与官方 `dsh-tool-skill` 的默认值同源,抬成两套会让同一技能在不同预设下长度不一致。提示词域未动。
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
13
65
|
## [0.12.0] - 2026-09-20
|
|
14
66
|
|
|
15
67
|
### 新增
|
package/README.md
CHANGED
|
@@ -74,7 +74,13 @@ dsh plugin --profile web add dsh-plugin-tool-management@latest
|
|
|
74
74
|
装完提醒我硬刷新浏览器。
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
模型可用
|
|
77
|
+
模型可用 20 个工具管理上述功能(`mcp_manager_*` / `skill_manager_*` / `prompt_manager_*` / `memory_manager_*` / `subagent_manager_*`);脚本走 `POST /dsh-plugin-tool-management/api`(`{op, args}` 协议)。
|
|
78
|
+
|
|
79
|
+
这 20 个工具的说明合计约 3,450 token,而工具表**每一轮请求都随工具发一遍**。用不上的可以在「兼容」页的**「模型工具表」**块里逐个关掉(也能按域全关)——关掉的整份不进请求,这是唯一真省 token 的办法。关掉之后模型调不到它,**面板不受影响**(114 个 op 与工具表互不相干)。默认一个都不关。
|
|
80
|
+
|
|
81
|
+
另外有一个工具会**自动让位**:会话里已经挂了官方 `skill` 工具(标准类预设都挂)时,我们那个「按名字读技能正文」的 `skill_manager_read` 不再下发 —— 两份干的是同一件事。极简模式没有官方那件,我们的照旧留着。
|
|
82
|
+
|
|
83
|
+
其中 `subagent_manager_run` 依赖宿主已挂载 `dsh-subagent-*` provider 包 —— 但**注册不依赖**它:provider 缺席时工具照样注册,是**调用那一刻**报「子代理服务未挂载(ctx.subagents 缺失)」(`src/subagents/service.ts` 的 `ensureProvider`)。另外四个(`_list` / `_set_enabled` / `_create` / `_update`)动的只是 hub 里的人设文件与启停名单,与 provider 无关,任何时候都该可用。真正的注册失败(宿主 API 变更等)会被逐个记下,随子智能体页的横幅与 `preset-tools` 的 `unavailable` 一起显示出来。
|
|
78
84
|
|
|
79
85
|
---
|
|
80
86
|
|
|
@@ -89,7 +95,7 @@ dsh plugin --profile web add dsh-plugin-tool-management@latest
|
|
|
89
95
|
- **「进/出模式」与「启用场景」是两个独立状态轴**:界面开关是唯一入口(两轴齐动)。绕过界面直接调 HTTP API 时要注意:`scene-mode-set{scene:null}` 只退运行时快照,**不清空启用集** —— 记忆与提示词仍按该场景注入;要彻底退出还需 `rules-set-active{scenes:[]}`。
|
|
90
96
|
- **导入**:`.md` / `.zip`(目录名 = 场景,bundle 带附件),同名跳过绝不覆盖,超限逐条回报。
|
|
91
97
|
- **导出**:勾选记忆打包成 zip,保留「场景/名称」层级;bundle 型连目录里的附件一起打进去。只读源文件。
|
|
92
|
-
- **注入预算**:默认
|
|
98
|
+
- **注入预算**:默认 128 KiB,放不下的跳过并列出清单。删除进回收站。
|
|
93
99
|
- **子代理会话不注入记忆**:记忆只在**顶层会话**注入 —— 它是"父会话的现场",不是子代理完成任务所需的事实;子代理的上下文只留「角色 + 任务」,要记忆可用 `memory_manager_list/read` 自己取,相关事实应由父代理写进 `task`。其余域不受影响(MCP / 技能 / 提示词照常注入,人设目录按各自的 `catalogDepth`)。
|
|
94
100
|
- **场景锁定**:锁定后 MCP / 技能 / 子智能体 / 记忆 / 提示词五个域的**增删改**整体只读,界面禁用 + 服务端守卫双侧拦截;未启动不能上锁,锁定中不能关闭,先解锁再改。**冻结的是"内容",不是"场景本身"** —— 场景的新建 / 删除 / 改名 / 提示词绑定 / 启用切换 / 回收站的恢复与永久删除、MCP 重启、导出、注入设置与令牌设置都不在冻结清单内(它们不是"场景档案里的内容")。其中「启用切换」在锁定场景正在生效时会被拒绝 —— 清空启用集合会让模型侧的写门禁失去判据(运行时却还是那个场景的档案态)。
|
|
95
101
|
- **删除场景 = 连记忆一起删**:场景记录、档案与全部记忆进同一条回收站条目,恢复按原路径整条放回;使用中的场景拒绝删除。场景名可改(连带目录与档案,记忆正文不动)。
|
|
@@ -144,7 +150,7 @@ dsh plugin --profile web add dsh-plugin-tool-management@latest
|
|
|
144
150
|
|
|
145
151
|
插件运行期用宿主同一批 `@deepseek-ai/*` 库——必须是同一份物理模块,否则判断退化成猜。
|
|
146
152
|
|
|
147
|
-
-
|
|
153
|
+
- **「兼容」页**:宿主版本、能力可用数、每个动作走原生/适配/不可用、降级项与原因。体检本身只读,但这一页有三个明确的写入口:**访问令牌**(写 profile 的 `cordis.patch.yml`,重启生效)、**注入设置**(写 `inject-settings.json`,即时生效)与**模型工具表**(写 `tool-table.json`,即时生效)。
|
|
148
154
|
- **命令行**:`node scripts/doctor.mjs`(体检)、`node scripts/host-deps.mjs --fix`(依赖对齐)、`npm run sync:profile`(把构建产物镜像到 profile 里那份本地安装 —— `file:` 装的是硬链接拷贝,构建新增的文件不会自动过去)。
|
|
149
155
|
- `minimal` 这类**压制型预设**(persona `complete` / 关闭运行时上下文)下,本插件的注入**默认停用**(跟随预设的设计意图),提示词与技能也因官方那两行没挂而缺席 —— 兼容页逐列标出,同一页的「注入」块可以按域强制打开。
|
|
150
156
|
- **关掉「技能」「提示词」的勾选 = 真的不再注入**:这两项在标准类预设下由宿主自己送(插件让位),所以取消勾选会**连宿主那份一起停掉**(`skill-catalog` / `agent-instructions` 的消息在这一步不再放行)。其余三项(记忆 / MCP / 子智能体)宿主本来就不送,勾选完全生效。
|
|
@@ -166,6 +172,8 @@ dsh plugin --profile web add dsh-plugin-tool-management@latest
|
|
|
166
172
|
| 记忆索引 / 场景 / 档案 | `~/.dsh/tool-management/memories-index.json` |
|
|
167
173
|
| MCP 侧车(停用表 / 已知工具 / 备注 / 设置) | `~/.dsh/tool-management/mcp-*.json` |
|
|
168
174
|
| 注入设置(五个域开关 / 压制型预设口径) | `~/.dsh/tool-management/inject-settings.json` |
|
|
175
|
+
| 模型工具表(不发给模型的工具) | `~/.dsh/tool-management/tool-table.json` |
|
|
176
|
+
| 场景页界面设置(进场景前弹不弹预览卡) | `~/.dsh/tool-management/scene-settings.json` |
|
|
169
177
|
| 运行日志 / patch 备份 | `~/.dsh/tool-management/tool-management.log` · `backups/` |
|
|
170
178
|
|
|
171
179
|
**插件安装目录里不存用户数据**(`dsh plugin update` 会整体替换该目录)。
|
package/README_EN.md
CHANGED
|
@@ -74,7 +74,11 @@ dsh plugin --profile web add dsh-plugin-tool-management@latest
|
|
|
74
74
|
Then remind me to hard-refresh the browser.
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
The model can manage everything above via
|
|
77
|
+
The model can manage everything above via 20 tools (`mcp_manager_*` / `skill_manager_*` / `prompt_manager_*` / `memory_manager_*` / `subagent_manager_*`); scripts use `POST /dsh-plugin-tool-management/api` (`{op, args}` protocol).
|
|
78
|
+
|
|
79
|
+
Those 20 tool definitions total roughly 3,450 tokens, and the tool table is **sent with every single request**. Switch off the ones you never use in the **"Model tool table"** block on the **Host tab** (one by one, or a whole domain at once) — a switched-off tool is not sent at all, which is the only thing that genuinely saves tokens. The model then cannot call it, but **the panel is unaffected** (the 114 ops and the tool table are independent). Nothing is switched off by default.
|
|
80
|
+
|
|
81
|
+
One tool also **yields automatically**: when the official `skill` tool is mounted in that conversation (every standard-class preset mounts it), our `skill_manager_read` ("load a skill body by name") is not sent — the two do the same job. The minimal preset has no official one, so ours stays.
|
|
78
82
|
|
|
79
83
|
---
|
|
80
84
|
|
|
@@ -89,7 +93,7 @@ The model can manage everything above via 14 tools (`mcp_manager_*` / `skill_man
|
|
|
89
93
|
- **"Entering/leaving the mode" and "enabling a scene" are two independent state axes**: the UI toggle is the only entry point (it moves both axes at once). If you bypass the UI and call the HTTP API directly, note that `scene-mode-set{scene:null}` only drops the runtime snapshot and does **not clear the enabled set** — memories and the prompt keep being injected for that scene; a full exit also needs `rules-set-active{scenes:[]}`.
|
|
90
94
|
- **Import**: `.md` / `.zip` (dir name = scene, bundles carry attachments), same names skipped never overwritten, over-limit items reported.
|
|
91
95
|
- **Export**: pick memories and zip them, keeping the `scene/name` layout; bundle memories bring their attachments along. Sources are read-only.
|
|
92
|
-
- **Injection budget**: default
|
|
96
|
+
- **Injection budget**: default 128 KiB, oversized memories skipped with a list. Deletes go to recycle bin.
|
|
93
97
|
- **Subagent sessions do not receive memories**: memories are injected into the **top-level session only** — they are the parent's situation, not the facts a child needs; a child's context stays "persona + task", it can read memories on demand with `memory_manager_list/read`, and relevant facts belong in the `task`. Other domains are unaffected (MCP / skills / prompts still inject; the persona catalog follows each persona's `catalogDepth`).
|
|
94
98
|
- **Scene lock**: once locked, create/update/delete across MCP / skills / subagents / memories / prompts is read-only — UI disabled plus a server-side guard; a scene must be running to lock, and a locked scene can't be closed until unlocked. **What freezes is the content, not the scene itself**: creating/deleting/renaming a scene, rebinding its prompt, switching the active set, recycle-bin restore and purge, MCP restart, export, injection settings and token settings are all outside the frozen list (they are not "content of the scene profile"). Switching the active set *is* refused while a locked scene is in effect — clearing it would leave the model-side write guard with nothing to check while the runtime still runs that scene's profile.
|
|
95
99
|
- **Deleting a scene deletes its memories too**: the scene record, profile and every memory go into one recycle-bin entry, restored as a whole; a running scene refuses deletion. Scene names are renameable (dir and profile follow, memory bodies untouched).
|
|
@@ -145,7 +149,7 @@ The model can manage everything above via 14 tools (`mcp_manager_*` / `skill_man
|
|
|
145
149
|
|
|
146
150
|
The plugin uses the host's own `@deepseek-ai/*` libraries at runtime — they must be the same physical modules, or every "adapt to host" decision degrades into guesswork.
|
|
147
151
|
|
|
148
|
-
- **Host tab**: host version, usable capability count, per-action routing (native/adapter/unavailable), degradations & reasons. The check-up itself is read-only, but the page has
|
|
152
|
+
- **Host tab**: host version, usable capability count, per-action routing (native/adapter/unavailable), degradations & reasons. The check-up itself is read-only, but the page has three explicit write entries: **access token** (writes the profile's `cordis.patch.yml`, takes effect after restart), **injection settings** (writes `inject-settings.json`, takes effect immediately) and **model tool table** (writes `tool-table.json`, takes effect immediately).
|
|
149
153
|
- **Command line**: `node scripts/doctor.mjs` (check), `node scripts/host-deps.mjs --fix` (align deps), `npm run sync:profile` (mirror the build into the profile's local install — a `file:` install is a hard-linked copy, so files ADDED by a build never show up there on their own).
|
|
150
154
|
- Under a **suppressing preset** such as `minimal` (persona `complete` / runtime context off) this plugin's injection is **off by default** (following the preset's intent), and the prompt and the skills are missing because their official rows are not mounted — the Host tab marks this per column, and its "Injection" block can force any domain back on.
|
|
151
155
|
- **Unchecking "Skills" or "Prompt" really stops them**: under standard presets the host delivers those two itself (the plugin steps aside), so unchecking now also stops the host's copy — the `skill-catalog` / `agent-instructions` messages are no longer let through on that step. The other three domains (memory / MCP / subagents) are only ever sent by this plugin, so their toggles were already complete.
|
|
@@ -167,6 +171,8 @@ The plugin uses the host's own `@deepseek-ai/*` libraries at runtime — they mu
|
|
|
167
171
|
| Memory index / scenes / profiles | `~/.dsh/tool-management/memories-index.json` |
|
|
168
172
|
| MCP sidecars (disabled tools / known tools / notes / settings) | `~/.dsh/tool-management/mcp-*.json` |
|
|
169
173
|
| Injection settings (five domain switches / suppressing-preset policy) | `~/.dsh/tool-management/inject-settings.json` |
|
|
174
|
+
| Model tool table (tools not sent to the model) | `~/.dsh/tool-management/tool-table.json` |
|
|
175
|
+
| Scenes-page preference (preview card before entering a scene) | `~/.dsh/tool-management/scene-settings.json` |
|
|
170
176
|
| Runtime log / patch backups | `~/.dsh/tool-management/tool-management.log` · `backups/` |
|
|
171
177
|
|
|
172
178
|
**No user data is stored inside the plugin's install directory** (`dsh plugin update` replaces it wholesale).
|
package/docs/update.md
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
| 版本 | 发布 | 主题 |
|
|
6
6
|
| ---------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
7
|
+
| [0.13.0](#0130---2026-09-23) | 2026-09-23 | 模型多五个管理工具 + 所有写操作都要用户点头 + 工具表可关(省 token)+ 进场景前先看一眼会改什么 + 悬空引用体检 + 注入实况改为只数当前这段对话 + 技能正文一步读到 + 记忆页显示体积 + 门禁清单合成登记表 + 自定义目录的技能修好
|
|
8
|
+
| [0.12.1](#0121---2026-09-22) | 2026-09-22 | 子智能体列表行:人设名与描述分行 + 客户端类型检查进门禁 + 四个注入上限抬高 |
|
|
7
9
|
| [0.12.0](#0120---2026-09-20) | 2026-09-20 | 兼容页「功能总览」+ 停用工具真的从模型工具表消失 + 补丁写入前做解析校验(拦"写坏 DSH")+ doctor 三项新检查(挂载心跳 / 裸模块名 / 版本栅栏)+ 删除入口先不切换 + 投影缓存屏障与删除前置检查加固 + 关域拦截顺序钉死 |
|
|
8
10
|
| [0.11.0](#0110---2026-09-20) | 2026-09-20 | 访问令牌卡片重构(可设置 / 关闭 / 修改 / 删除)+ 没解锁时锁住输入框 + 令牌安全修复 + 批量启停可撤销 + 兼容页清理旧备份 + 两页可搜索 + 体检改为真调 + 一批凭据与数据损坏修复 + 搜索与列表提速 |
|
|
9
11
|
| [0.10.0](#0100---2026-09-18) | 2026-09-18 | 注入框架改 markdown(动作句加粗前置)+ 注入采纳统计 + 人设角色框 / inherit / catalogDepth + 场景锁定补齐模型侧 + 记忆删除全走回收站 + 错误码全量双语 |
|
|
@@ -19,6 +21,50 @@
|
|
|
19
21
|
|
|
20
22
|
---
|
|
21
23
|
|
|
24
|
+
## 0.13.0 - 2026-09-23
|
|
25
|
+
|
|
26
|
+
- **模型能管的比以前多了五个**:以前它看得到一份记忆、看得到一个人设,却开关不了也改不了(技能与 MCP 那两域早就能全操作)。现在记忆的启停与修改、人设的启停与新建修改都补上了。提示词按裁定只留「应用」。
|
|
27
|
+
|
|
28
|
+
- **所有会改东西的工具都写明了"要用户开口或先同意"**。以前只有两个工具有这句话,其余靠确认门兜 —— 而那个门是可以关掉的(设置里关掉记忆确认,或会话走「完全权限」预设)。顺带把工具说明删瘦了一圈:这些文字每次请求都要发给模型,八个改过的存量工具加起来从 2,047 → 1,980 字节,**加了上面那句还净降 67**。
|
|
29
|
+
|
|
30
|
+
- **点「进入场景」会先弹一张卡**:说清这次会启用/停用哪几台 MCP 服务器、哪几个工具、哪几个技能目录与技能、哪几个人设,以及记忆范围收窄到哪一场景;末尾再补两行"进入后是什么样"——**启用 N 台 MCP**、**启用 N 条记忆**(含公共基线与全局)。不想看这张卡就点「不再显示」(场景页右上角有「关闭提醒 / 开启提醒」可以随时改回来);卡上只有「确认进入」与「不再显示」两颗按钮,关掉卡片用右上角的「关闭」。只有**真的会变**的才列:没在跑的服务器不会被写成「停用 N 个工具」,技能也只显示名字(不再带 `custom-…` 那串机器名)。
|
|
31
|
+
|
|
32
|
+
- **改名留下的"悬空引用"有地方说了**:档案里存的是服务器名、技能名、人设名,场景记录里存的是预设 id。你把「代码审查」改名「复核员」,档案里那行还是旧名 —— 界面看着还绑着,委派时按新名找不到。现在场景页顶部会有一条黄横幅说清"哪一条指向谁、那个谁不在了"。只数出来、不自动改。
|
|
33
|
+
|
|
34
|
+
- **读技能正文少了一步**:新工具按名字一次给到正文和路径,而且按与目录同一套规则挑副本 —— 同名几份时读到的就是真正生效的那一份,不会读到被覆盖的影子。
|
|
35
|
+
|
|
36
|
+
- **工具说明可以关掉不发**:工具表每一轮请求都随工具发一遍,20 个工具的说明合计约 3,500 token,这一轮用不上也照付。兼容页新增「模型工具表」,逐个勾选(也能按域全关),关掉的**整份不进请求**——这是唯一真省钱的办法,默认一个都不关。关掉之后模型调不到它,**但插件面板一切照旧**(关掉 `mcp_manager_add` 之后 MCP 页照样能加服务器)。
|
|
37
|
+
|
|
38
|
+
- **有一个工具会自动让位**:技能那条「按名字读正文」在会话里已经有官方 `skill` 工具时不再下发——两份干的是同一件事。极简模式没有官方那件,我们的照旧留着。只影响那个会话的工具表,能力不减(管理视角的"读一个被关掉的技能"在面板里做)。
|
|
39
|
+
|
|
40
|
+
- **注入实况那三个数改成只数「最近这一段对话」**:以前是开机以来一路累加,用一下午之后「注入 8 次 · 从未调用」讲的是"今天这台机器",而你打开面板问的是"眼前这段里模型用没用"。现在每段对话各记一本账,换一段重新数。
|
|
41
|
+
|
|
42
|
+
- **记忆页每行显示正文体积**:记忆是唯一直接进上下文、直接吃预算的那一域(每个场景段 128 KiB),以前看不出哪条大。
|
|
43
|
+
|
|
44
|
+
- **场景描述能写到 300 字了**(原来 60),输入框下面那句提示删掉了 —— 卡片上那行本来就用省略号截,60 卡的是"能存多少",给的理由说的却是"显示多少"。四个注入上限也重新校准:记忆段 256 → 128 KiB;技能 / 子智能体 / MCP 三条目录都收到 50;MCP 备注 200 → 300 字。
|
|
45
|
+
|
|
46
|
+
- **界面补了四处小东西**:新增 MCP 服务器的弹窗能顺手写备注了;MCP 备注、人设描述、技能描述、记忆描述五处输入加了「当前 / 总字数」(分母就是模型实际能读到的长度);场景页加了搜索框;`/` 聚焦搜索框、Esc 清空它(只挂在插件自己那块 UI 上,不抢宿主的快捷键)。
|
|
47
|
+
|
|
48
|
+
- **门禁那几份清单合成了一张登记表**:哪些 op 要令牌、哪些在场景锁定时不许动、哪些改完要同步进场景档案……原来是五份各自抄写的名字清单,加一个新 op 得记得挨个补,这事已经漏过四次(后果不是报错,是"没配令牌也能改"或者"锁定的场景还能改")。现在每个 op 只登记一次,那五份清单都从它生成,派生结果与改之前**逐条相同**。启动时还会反查一遍登记表,有 op 没登记、有登记留着但 op 早改名了,都在兼容页挂提示。
|
|
49
|
+
|
|
50
|
+
- **自定义技能目录里的技能能调动了**:以前列表里看得到、也标着"已启用",模型一调却报"没有这个技能"。原因是两处用了不同的来源清单 —— 取正文时只查那五个固定目录,你添加的自定义目录永远落空。
|
|
51
|
+
|
|
52
|
+
- **「采纳」这个数改准了**:以前你把某个域关掉之后模型去调它的工具,照样记一次采纳 —— 因为「××已清空」那条通知也带着域标记,被当成了"正文在眼前",第三列其实是第二列的复印件。现在通知不算正文了,「调用 − 采纳」才有得读。
|
|
53
|
+
|
|
54
|
+
- **README 里有一处说错了,已改**:原文说子智能体那两个工具"依赖宿主挂载 provider 包,缺席时不注册、界面也不提示"。实际是注册不受影响,要到**调用的那一刻**才报"子代理服务未挂载";而真的注册失败时,界面上**是**有提示的。
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 0.12.1 - 2026-09-22
|
|
59
|
+
|
|
60
|
+
- **子智能体页的列表行改了版式**:人设名与描述分成两行。以前名字和描述挤在同一横排里、右边还压着开关和两颗按钮,名字只剩两三个字符宽(显示成 `co...`);现在名字独占一行、装不下才按省略号截断(悬停看全名)。
|
|
61
|
+
|
|
62
|
+
- **客户端的类型检查进了门禁**:`typecheck:client` 以前只是定义在那里、没有任何地方调用,而且是红的。修掉后并进了 `npm test` 与发布前置 —— 客户端改动不再只有语法检查这一道网。
|
|
63
|
+
|
|
64
|
+
- **四个注入上限抬高了**:记忆段预算 64 KiB → 256 KiB;技能目录 50 条 → 60 条;子智能体 40 条 → 60 条;MCP 50 条 → 60 条。描述截断窗口没动(技能与官方同源,抬成两套会让同一技能在不同预设下长度不一致)。提示词域也没动。
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
22
68
|
## 0.12.0 - 2026-09-20
|
|
23
69
|
|
|
24
70
|
- **兼容页多了一块「功能总览」**:一行一个功能点,第一行就是「插件是否完整挂载」;状态是装配层 + 宿主能力层 + 你当前配置的合成结果(正常 / 降级 / 未启用 / 受令牌限制 / 部分生效 / 不可用),点一行跳到对应页签。它回答的是"现在到底哪一项能用、为什么不能用"。
|