dsh-waifu-agents 0.1.2 → 0.1.4
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/MAINTAINER.md +16 -10
- package/README.md +6 -4
- package/index.js +4576 -4364
- package/package.json +1 -1
- package/selftest.mjs +192 -9
package/MAINTAINER.md
CHANGED
|
@@ -36,9 +36,13 @@
|
|
|
36
36
|
- **`order` 注册时整体加 `PERSONA_ORDER_BASE`(10000)。** registry 的排序是**单一全局键**(`(a.order ?? Infinity) - (b.order ?? Infinity) || a.id.localeCompare(b.id)`,`dsh-agent-preset-registry`),四个内置模式占 1..4,而面板的拖拽只写 1..n——两家人落在同一个区间里,新任务页就会读出 `后藤一里 / standard / 大肥鱼 / ptc / …`。偏移**只在注册时**加,文件里留的仍是局部序号。改这个常量等于改「人设能排到多低」,别往小改。
|
|
37
37
|
- **换人的提示词读两头都写一遍,是刻意的。** `dsh-agent-loop` 的 `SystemPromptProjection.project()` 有两条路:`startsSeries`(或 `inHistory === false`)时**原地重写节点 0 并清空后面所有 system 节点**;反之在历史中间时,文本一变是 `surfaceOp: {op:'append'}` **追加一个新节点**——也就是说旧人设的正文还留在上下文里。只在开头说一次,模型很容易漂回上一位(这是「换人没生效」最常见的真身,日志里表现为命令回了「已切换」而下一轮的口吻没变)。`withSwitchNotice()` 因此前缀点名作废、后缀做最后确认。
|
|
38
38
|
- **重复切到同一个人不能回「已切换」。** 提示词一个字没变时,`project()` 返回空更新,不会有新的 system 节点,模型也不会被重新锚定——那句「已切换」是假话。`waifu-change` 用 `already === matched.id` 判出来,改回「本来就是 X · 没有改动」。
|
|
39
|
-
- **光改系统提示词仍然不够,真正落地靠「运行时快照」这条旁路。** 双写之后模型照样能拧回来:它拿**自己前几轮以旧身份说过的话**当锚,越问越犟。实测(`session-b6fb8a2b`):同一会话连切三次,三次请求的 system 节点都已经是新人设(`contextBreakdown.breakdown.systemTokens` 与唯一的 `system: true` 节点可证,且 `cacheReadTokens: 0`——内容确实换过),模型仍然三轮都自称第一位。病灶是位置:`project()` 在历史中间走 `append`,旧人设正文与**旧回答**都留着,而离提问最近的锚是它自己的输出。解法是再开一条**用户角色**的通道:注册 `ctx.systemPrompt.context({ name: 'waifu-agents:identity', order: 900, text })`(`IDENTITY_CONTEXT_NAME` / `IDENTITY_CONTEXT_ORDER`),为**每个 agent 每轮**生成一句「本轮身份 · 运行时确认」,交给平台自己的 `RuntimeContextProjection` 投影成一条 USER 消息、紧跟用户提问成为请求的最后一条。那句快照天生带「本条作废更早的快照」的语义,`preStep`(`agent-loop.js:902-924
|
|
39
|
+
- **光改系统提示词仍然不够,真正落地靠「运行时快照」这条旁路。** 双写之后模型照样能拧回来:它拿**自己前几轮以旧身份说过的话**当锚,越问越犟。实测(`session-b6fb8a2b`):同一会话连切三次,三次请求的 system 节点都已经是新人设(`contextBreakdown.breakdown.systemTokens` 与唯一的 `system: true` 节点可证,且 `cacheReadTokens: 0`——内容确实换过),模型仍然三轮都自称第一位。病灶是位置:`project()` 在历史中间走 `append`,旧人设正文与**旧回答**都留着,而离提问最近的锚是它自己的输出。解法是再开一条**用户角色**的通道:注册 `ctx.systemPrompt.context({ name: 'waifu-agents:identity', order: 900, text })`(`IDENTITY_CONTEXT_NAME` / `IDENTITY_CONTEXT_ORDER`),为**每个 agent 每轮**生成一句「本轮身份 · 运行时确认」,交给平台自己的 `RuntimeContextProjection` 投影成一条 USER 消息、紧跟用户提问成为请求的最后一条。那句快照天生带「本条作废更早的快照」的语义,`preStep`(`agent-loop.js:902-924`)每轮都发,**只在身份变过时**才有内容——判据是「这一轮要服务的人设,和上一轮服务过的不是同一个」(`servedIds` / `noteServed` / `switchOf`),空会话、以及从未换过人的会话回 `""`。
|
|
40
40
|
- 两条硬约束:① 这段文本同样会被 `interpolate()` 处理,**不能**出现 `{{…}}`,否则整条渲染失败;② `template.json` 里 `persona` 那一行的 `includeRuntimeContext` **必须是 `true`**。设成 `false` 时 `@deepseek-ai/dsh-persona` 会调 `ctx.systemPrompt.suppressRuntimeContext()`,那是**调用作用域级**的整片清空——它会连这条身份快照一起抹掉,外部表现恰好是「怎么切都不动」,而 system 提示词那一侧看起来完全正常(这就是这个 bug 藏了这么久的原因)。
|
|
41
41
|
- 想关这条通道用插件配置的 `identityReminder: false`(**不要**去改 `includeRuntimeContext`,那会连带关掉平台自己的运行时上下文)。
|
|
42
|
+
- **「换过人了」是会话的事实,不是人设从哪一层解析出来的。** 初版把判据写成 `source === 'override'`(= 这个会话被外挂改过),**`/waifu-reset` 正好是它的反例**:回到挂载人设走的是 `mounted` 那一层,于是这一轮前缀、后缀、运行时快照**全部沉默**。实测 `session-a367789b`(2026-10-14 13:42):`/waifu-reset` 把 system 节点**正确**重写成 达克妮斯,快照却悄悄丢掉了身份那一段,模型下一轮照样用 照桥心美 的口气回答(它自己的推理写着 `Komi would react with shock`)——锚是它自己的历史。现在的判据是**服务过的人设变了**:`noteServed()` 在 `resolvePersonaText` 里记账(`servedIds` 存上一轮服务的是谁),变了就写一条 `lastSwitch` 备忘(`{ id, previousId, previousName }`),`switchOf()` 按「正在服务的这一位是不是那条备忘指的人」读回来。`reAnchored()` = `source === 'override' || switchOf(...) !== null`,**前缀与快照用同一个判据**,所以 reset 这一轮也会被点名,之后的轮次保持同一段文本(平台只提交**变过**的快照,所以不会每轮重发)。
|
|
43
|
+
- 记账必须放在 `resolvePersonaText` 里,因为**装配顺序是确定的**:`.ref/system-prompt.js:315` 先跑 `variables[name] = provider(context)`,`:348` 才跑 context 文本——人设文本永远先于身份快照被求值,所以同一次 `assemble()` 里两者读到的是同一份簿记。`assemble()` 每个 step 只跑一次(`agent-loop.js` `preStep`)。
|
|
44
|
+
- 有意的副作用:会话换过人之后,服务文本会**一直**带着 `【人设已切换】`(旧版对 override 就是这样,reset 现在也一致),好处是文本逐轮不变,`project()` 只在换人那一次重写提示词。
|
|
45
|
+
- **已知边界**:`servedIds` / `lastSwitch` 是进程内内存,重启 DSH 后第一次装配不知道会话之前服务过谁,**那一轮不发新快照**。但上一次换人时发的那条快照是**普通 USER 消息、已经落在会话历史里**,模型照样看得到——真正的缺口只有「换人发生在安装这个修复之前的旧版本里」这种历史遗留,以及同一个进程内从未被本插件装配过的会话。
|
|
42
46
|
|
|
43
47
|
## op 一览
|
|
44
48
|
|
|
@@ -83,6 +87,7 @@ updateCheck updateApply updateProgress purge
|
|
|
83
87
|
- **非法 id 不进选择器**:`choosableRows()` 只收 `problems` 为空且 `idOk` 为真的行。
|
|
84
88
|
- **条件样式必须把键写进基础样式,不能让 React 去"移除"。** 这一条看着像代码风格,其实是面板高亮的生死线。React 丢弃一个不再收到的样式属性时写的是 `style[name] = ''`;对普通属性这没问题(开关的 `transform` 就是这么被清掉的,实测正常),但对**简写里的属性不行**:清掉 `borderColor` 之后,`border: 1px solid …` 会把颜色重新应用一遍,而"颜色被清掉"的边框会回落到 `currentColor`。本主题下 `currentColor`(`--dsw-alias-label-primary`)和品牌色(`--dsw-alias-brand-primary` = `neutral-bluish-50`)是同一个近白,于是**一个已经不是默认的行看起来仍然选中**,只有重挂载才会好。这正是用户报的「多次切换默认人设后,选中过的 border 样式存在残留,再次进入就消失了」——而且只发生在**点过的**那些行上(点过才有机会被设过品牌色),没点过的行用的是显式的 `border-l1`。所以 `L.item` 里同时写明 `border` 和 `borderColor`/`borderStyle`,`L.switch` 写明 `borderColor`,`L.thumb` 写明 `transform: 'translateX(0)'`。自测里有一条按**键集合**遍历所有 `条件变体/基础` 配对的断言,加新的条件样式时它会替你拦住。
|
|
85
89
|
- **会话顶部那个 chip 不是我们的,是 `projectionValues.agentPreset`。** 它由**唯一一种事件**推进:`agent-preset/selected`(`registry.js` 的 `apply` 只认这个),而写它的只有平台的 `select()`。`select()` 对**已开过轮**的会话会抛 `agent-preset/locked` —— 因为"真的换"意味着重挂载整套 preset、连工具一起换。所以 `/waifu-change` 追加**事件本身**:只动标签,不动正在跑的树;人设本来就有 override 在供,标签和模型听到的因此终于一致。两条硬约束:① 只能写**已注册**的 preset id(值会被持久化,恢复会话时按它挂载,写一个没人提供的 id 会让下次恢复失败);② 插件配置的 `syncSessionChip: false` 可以整条关掉(关的理由是这条通道同时决定恢复时挂载谁)。`/waifu-reset` 对应地把标签挪回"会话挂载的那一位,没有就回落到全局默认"。
|
|
90
|
+
- **"这个会话自己是谁"必须在下 override 的那一刻记下来,之后再读就读不到了。** 这是上一条的直接后果,也是 0.1.4 修的 bug(实测 `session-00777175`,2026-10-14 14:23:会话创建时戳的是当时全局默认 达克妮斯,随后在新建任务页改选 惠惠 —— 那是一次 `agent-preset/selected`,chip 因此显示 惠惠,第一轮也确实是 惠惠;`/waifu-change 达克妮斯` + `/waifu-reset` 之后却回到 达克妮斯)。原因不是读错了谁,而是**插件自己把 chip 写成了 override**(`rememberSessionPreset`,见上一条),reset 又把那个 chip 当"会话挂载"读了回来。一个会话其实有**三个**候选答案,一旦被改选过就互不相同:`header`(出生时戳的)/ 换人前的投影(它自己)/ 投影现在的值(override)。只有中间那个是它自己的,而下完写就没了。所以 `setOverride(sessionId, personaId, ownPreset)` 把**第一次**下 override 时读到的投影记进 `overrides.json` 的 `resting` 字段(第二次换人不覆盖它:那时 chip 已经是上一个 override,读回来只会是插件自己的上一次答案),`restoreSessionPreset(agent, resting)` 与 `/waifu-reset` 的落点都以它为准,读不到才退回 `header` 再退回全局默认。断言覆盖:换人记录的是"换之前在跑的那位"(**故意让 header 说别的**,否则断言跟实现对不上也看不出来)、reset 回到它、下一轮真的按它供、第二次换人不改这个答案、以及**标签挪不动时必须出声**(reset 文案追加「会话标签没跟上」,因为 chip 是恢复会话时决定挂载谁的持久值,静默失败会以「重启后怎么又是她」的形式复活)。
|
|
86
91
|
- **宿主侧拿"还活着的 agent"只有这两个口子,已对着实现核实。** `@deepseek-ai/dsh-agent` 的服务名是 `agents`(`super(ctx, "agents")`),公开方法 `list()`("All live agents, in registration order",返回全新数组)、`get(id)`、`roots()`、`enter()`、`announce()`。`agent` 对象带 `.id` / `.ctx` / `.session`,而且 **`agent.id` 就是 session id**(`agent-preset-registry` 的 `select` 错误载荷里 `sessionId: agent.id`,`dsh-agent-loop` 也是 `agents.get(sessionId)`)。`agentPresets.select` 的远程绑定写着 `scope: { context: 'agent', wire: 'agentId' }` + 第一个参数 `lookup: 'agent'`——平台自己就是把 agentId 解析成 agent 再调 `select(agent, preset)`,所以本地直接调同一个方法形状是对的,**不需要绕 remote**。`sessionProjections` 的服务名是 `sessionProjections`,`stateOf(session, key)` 返回该投影当前值、未注册的 key 返回 `undefined`——这是读"chip 现在显示谁"的唯一正确方式(读 `session.header.agentPreset` 会错,见上条)。
|
|
87
92
|
用 `_tools/asar-ls.mjs` 复核(Git Bash 下记得 `MSYS_NO_PATHCONV=1`,否则 asar 内部路径会被改写成 Windows 路径):
|
|
88
93
|
```bash
|
|
@@ -102,7 +107,7 @@ updateCheck updateApply updateProgress purge
|
|
|
102
107
|
## 测试与 CI
|
|
103
108
|
|
|
104
109
|
```bash
|
|
105
|
-
pnpm test # = node selftest.mjs,
|
|
110
|
+
pnpm test # = node selftest.mjs,323 条断言,离线、不碰 profile、不联网
|
|
106
111
|
pnpm pack # 先看产物清单
|
|
107
112
|
pnpm publish --no-git-checks
|
|
108
113
|
```
|
|
@@ -135,11 +140,12 @@ CI 在 `.github/workflows/test.yml`:push 到 `main`、开 PR、或手动触发
|
|
|
135
140
|
15. **同一条会话里换人再问一句** → 口吻必须真的变了(这是整件事唯一的真证明);再打 `/waifu-current` → **只有一行**,且指明当前是谁。**接着连切三次不同的名字** → 每一次口吻都要跟着走(「切了但一直是同一个」是这套设计的头号失效模式)。再切**同一个人** → 必须回「本来就是 X · 没有改动」,不能回「已切换」。顺手确认旁路通道:换人之后每一轮的请求**尾部**应多出一条**用户角色**的「本轮身份 · 运行时确认」,没换过的会话不该有这条(有它 = `includeRuntimeContext` 没被改坏)。
|
|
136
141
|
16. 打 `/waifu-change`(不带参数)→ 弹选择器,搜索能过滤、当前那位打勾;选一个 → 会话里出现一条「已切换」的记录。
|
|
137
142
|
17. 先在「人设」工具条打开「拖拽排序」(关着的时候行内控件正常、拖动无效)→ 整行拖到另一行上 → 顺序变了;**开着的时候行内的展开 / 开关 / 导出 / 归档必须点不动**;关掉 DSH 再打开顺序还在;打开那个 `.md` 确认**正文没被动过**。
|
|
138
|
-
18. `/waifu-reset` →
|
|
139
|
-
19.
|
|
140
|
-
20.
|
|
141
|
-
21.
|
|
142
|
-
22.
|
|
143
|
-
23.
|
|
144
|
-
24.
|
|
145
|
-
25.
|
|
143
|
+
18. `/waifu-reset` → 回落到这个会话**自己**的那一篇(落点规则见第 19 条),**而且下一轮的口吻必须真的变回那一位** —— 这是 0.1.3 修掉的一个真 bug(`session-a367789b`,2026-10-14 13:42):reset 走 `mounted` 层,初版把「换过人了」判成 `source === 'override'`,于是前缀与运行时快照**双双沉默**,模型继续用刚被 reset 掉的那位回答。验收点两条:① 请求尾部那条「本轮身份 · 运行时确认」快照必须**点名**回落到的这一位,并带一句「(上一轮还是「X」)」;② 下一轮的回答确实是那一位。附带:换过人的会话此后每轮都带 `【人设已切换】` 前缀(**有意为之**,旧版对 override 就是这样),别当成 bug。**已知没修**:重启 DSH 之后第一次装配不知道这个会话以前服务过谁,「重启 → 接着那个被 reset 的会话聊」这一轮没有快照可发。
|
|
144
|
+
19. **reset 要回"这个会话自己的人设",不是"最后换到的那位"** —— 0.1.4 的验收点,现场三步:① 先在新任务页**改选一个人设**(别用全局默认那一位),发一句话确认第一轮是她;② `/waifu-change 另一位` → 变;③ `/waifu-reset` → 回的是 **①** 里那位,**不是**另一位,也不是全局默认。同一个会话再 `/waifu-change 第三位` + `/waifu-reset` → 仍然回 ① 那位。肉眼看得见的那半是**会话顶上那个标签**(`agent-preset/selected` 追加成功才会动);看不到的那半在 `~/.dsh/personas/overrides.json`:那条记录的 `resting` 必须是 ① 那位,而 `personaId` 随每次换人变。如果 reset 文案尾巴上多出一句「会话标签没跟上」,说明 chip 那次没挪动(`syncSessionChip: false` 或平台拒绝),这种情况下重启会话确实可能又变回那一位——**文案就是为这种情况准备的**,别当成误报。
|
|
145
|
+
20. **开一个新任务(别发消息)→ 看顶部 preset 下拉**:四个内置模式(standard / ptc / minimal / cordis)必须在**最上面四行**,自定义人设全在下面。这是 `PERSONA_ORDER_BASE` 唯一的验收点。
|
|
146
|
+
21. **默认开关连点**:把默认从 A 换到 B,再换到 C,**每换一次都留在面板里看**——高亮边框必须**当次**就落到新行上,不能还挂在旧行上等下次进来才自愈。然后开新任务,顶部下拉默认选中的必须是 C。
|
|
147
|
+
22. 把默认指向一个**正在被编辑、暂时组装不出来**的人设 → 设置页「新会话默认用谁」下面必须出现「这个默认指不到任何可用的人设」。
|
|
148
|
+
23. **改默认不该需要重启**:在插件面板把默认从 A 换成 B → **立刻**开一个新任务(别发消息)→ 顶部选择器默认选中的必须是 B。这是「写入有没有通知平台」唯一的验收点(`settings/document-updated`);走 `configEditor.edit()` 的旧路径这里会显示 A。
|
|
149
|
+
24. **切完看会话顶上那个标签**:在同一个会话里 `/waifu-change` 到另一位 → 会话标题旁边的标签必须**跟着变**。它不动就是 `agent-preset/selected` 没追加成功;把它写成 `syncSessionChip: false` 时标签**应该**保持不动。
|
|
150
|
+
25. **改默认要连"当前这个空会话"一起换**:让新任务页停在屏幕上别动 → 在插件面板把默认从 A 换成 B → **不要新建会话**,回来看新任务页顶上的选择器,必须已经变成 B。这一条和第 23 条**不是同一件事**:第 23 条考的是"之后新建的会话拿谁"(`selectedDefault`),这条考的是"已经摆在屏幕上的那个空会话"(`projectionValues.agentPreset`)。只修了第 22 条的版本,这里会停在 A——而且 Agent 预设页的「新任务默认」徽章**已经是 B**,两处对不上就是它。
|
|
151
|
+
26. **删掉人设文件 / 退掉默认那位,然后重启** —— 这是「悬空默认」的现场复现,也是这一版修复的验收点:① 把默认指向 A,**关掉 DSH**,把 `~/.dsh/personas/A.md` 从磁盘删掉(不走面板),重开 DSH → 新任务必须能正常建起来,**不能**出现 `agent-preset/not-found`;② 日志里应有一条 `WARN dsh-waifu-agents: 默认人设「A」已经不在名册里了…已清掉这条默认`;③ 打开插件面板 → 「新会话默认用谁」那行下面出现一条「已自动清掉」的说明(`defaultHealed*`),刷新一次面板后它消失;④ 面板里把默认设成 B → 在**面板里**退掉 B(归档)→ 默认必须跟着清掉,`~/.dsh/personas` 里出现 `B.md.off`,且下一次新任务不再失败。只有清了字段、没把屏上那个空会话一起挪走的版本,会在 ① 那里照样失败。
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|

|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**Waifu Agents** 是一款面向 **DSH** 的人设管理与动态切换插件,支持自定义 **Markdown** 人设、公共提示词配置、Agent Preset 管理、人设分组与排序、搜索、隐藏与恢复、默认人设设置,以及通过命令在下一轮对话中切换人设,让用户更灵活地定制和管理 AI 的角色、性格与回复风格。
|
|
6
6
|
|
|
7
7
|
## 它能做什么
|
|
8
8
|
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
| --- | --- |
|
|
25
25
|
| `/waifu-change` | **不带参数**:弹出选择器(可搜索、按分组、当前那位打勾)。**带名字**:`/waifu-change 大肥鱼` 直接切,名字可以只打前几个字 |
|
|
26
26
|
| `/waifu-current` | 一句话告诉你这个会话现在是谁在回答 |
|
|
27
|
-
| `/waifu-reset` |
|
|
27
|
+
| `/waifu-reset` | 清掉本会话的覆盖,回到这个会话**自己**的那一篇(也就是换人之前它在跑的那位,不是最后换到的那位) |
|
|
28
28
|
|
|
29
29
|
> **「轮次级」是什么意思**:换人**从下一轮开始生效**,你正在打的那一句不动,已经发出去的回答也不会重写。但**下一轮**的请求会带上新人设,并且额外附一句运行时的身份确认,让模型彻底放下上一位——只改系统提示词是不够的。细节见[第四节](#四会话开到一半想换人三条命令)。
|
|
30
30
|
|
|
@@ -110,7 +110,7 @@ dsh-waifu-agents@0.1.0
|
|
|
110
110
|
| --- | --- |
|
|
111
111
|
| `/waifu-change` | **不带参数**:弹出选择器(可搜索、按分组、当前那位打勾)。**带名字**:`/waifu-change 大肥鱼` 直接切;名字可以只打前几个字,唯一就能对上,歧义会列出候选 |
|
|
112
112
|
| `/waifu-current` | 一句话告诉你这个会话现在是谁在回答 |
|
|
113
|
-
| `/waifu-reset` |
|
|
113
|
+
| `/waifu-reset` | 清掉本会话的覆盖,回到这个会话**自己**的那一篇(也就是换人之前它在跑的那位,不是最后换到的那位) |
|
|
114
114
|
|
|
115
115
|
**怎么生效**
|
|
116
116
|
|
|
@@ -123,6 +123,8 @@ dsh-waifu-agents@0.1.0
|
|
|
123
123
|
- **重复切到同一个人不会假装生效**:打的是这个会话**已经在用**的那位时,回答是「本来就是 X · 没有改动」——提示词一个字都没变,平台不会重送,模型也不会被重新锚定,那一刻说「已切换」是假话。想真的重新锚定,先切到别人,再切回来。
|
|
124
124
|
- **打 `@` 也能挑**:候选菜单里多一组人设,选中就把 `/waifu-change 名字` 填进输入框,回车即可。
|
|
125
125
|
- **只列能用的人设**:你选中的那篇如果组装不出来,**不会替换**,这一轮仍然用原来那位。
|
|
126
|
+
- **`/waifu-reset` 也算换人**:回落之后这一轮照样会收到「人设已切换」和那句运行时身份确认,所以模型不会继续用刚被 reset 掉的那位说话。(早先的版本会——它把「换过人」判成「这个会话被外挂覆盖过」,而 reset 回落的是会话挂载的那一位,于是刚好漏掉。)
|
|
127
|
+
- **`/waifu-reset` 回的是「这个会话自己的人设」**,不是「你最后换到的那位」。一个会话其实有三个候选答案:创建时戳的那位、你在新任务页改选的那位、以及你后来换到的那位——换过之后只有第二个是它自己的,而且下完那次换人之后它就从会话上读不到了(标签已经被插件挪成新人)。所以第一次换人时插件会把「这个会话原来在跑谁」记进 `overrides.json` 的 `resting`,reset 按它回;换了很多次也一样回那一位,除非你从来没换过(那就没什么可回)。
|
|
126
128
|
- **会话顶上那个标签会跟着变**。以前它一直显示这个会话**创建时**挂的那一位,换了人也不动(那是平台的行为:给已经开过口的会话换挂载,等于把整套 preset 连同工具一起重装,平台会直接拒绝)。插件现在用平台自己的那条通道把标签挪过去,只动标签、不动正在跑的插件树——所以标签说的和模型听到的终于一致了。
|
|
127
129
|
- **一个副作用要知道**:标签也是**会话恢复时**用来决定挂载谁的。所以换过人之后,下次打开 DSH 恢复这个会话,它会真的按新人设装配(工具集也跟着换)。如果你不希望这样,把插件配置里的 `syncSessionChip` 设成 `false`,标签就保持原样不动。
|
|
128
130
|
|
|
@@ -300,7 +302,7 @@ template: _common.md
|
|
|
300
302
|
「拖拽排序」默认是关的(防误操作),在「**人设**」工具条打开。开着的时候整行可拖,行内的展开 / 开关 / 导出 / 归档会一起锁住——就是为了不让拖动半路变成误点。关掉立刻恢复。
|
|
301
303
|
|
|
302
304
|
**装新版本装不上、或装完还是旧版本。**
|
|
303
|
-
用**精确版本号**装(如 `dsh-waifu-agents@0.1.
|
|
305
|
+
用**精确版本号**装(如 `dsh-waifu-agents@0.1.3`)。装到磁盘 ≠ 正在运行,重启 DSH 才会换。
|
|
304
306
|
|
|
305
307
|
**卸载插件会删掉我的人设吗?**
|
|
306
308
|
不会。人设是普通文件,在「设置 → 目录来源」显示的目录里。
|