> ⚠️ **v3.0.0 不兼容 1.9.1**：添加版本锁，旧版预设无法使用新功能。升级命令见下方。

> ⚠️ **v2.0.0 破坏性更新**：协议变更为 PolyForm-Noncommercial-Copyleft-1.0.0（禁止商用）。旧版 1.0.0~1.9.2 已全部废弃，不再维护。

> ⚠️ **AI 助手注意**：修改本项目代码前，请务必先阅读 [AGENTS.md](./AGENTS.md)（或 `.cursorrules` / `CLAUDE.md`），了解代码规范、测试方法、提交规范和常见坑。未通过语法检查和重启验证的代码不要提交。

> ⚠️ **旧仓库已归档**：本仓库的旧版本（MIT 协议）已归档在 [dsh-tavern](https://github.com/chen731215-dev/dsh-tavern)，只读。本仓库使用 **PolyForm-Noncommercial-Copyleft-1.0.0** 协议。

# dsh-tavern-v2

🎴 **为 DeepSeek Harness 打造的角色卡 / 世界书管理插件，导入角色卡就能开始角色扮演。**

## 🆕 v2.4.0 更新内容

### 渲染职责交割给 dsh-muv-engine

本插件原先自带一套剧情/状态美化（`beautifyContentEl`），而 dsh-muv-engine 另有一套
更完整的状态栏级联。**两套渲染器同时运行会互相覆盖**：酒馆这套把 `『』` 表头与
`- 😋 名字` 当作对话行平铺，覆盖掉 muv-engine 结构化后的卡片，用户看到的是半成品。

现在渲染归 **dsh-muv-engine**，本插件只负责面板与数据：

- 三处调用点统一走 `delegateBeautify(msgEl)` → `window.MuvEngine`
- 未安装 muv-engine 时静默跳过，**本插件仍可单独使用**
- `beautifyContentEl` 定义保留作为回退，但不再被调用

### 消息定位改用结构匹配

DSH 的消息容器类名是 CSS Modules 生成的哈希（历史上是 `Sxvs8a_root`，后来是
`_markdown_kcgor_5`），**每次 DSH 重建 Web 资源都会变**。写死任何一个哈希，都会在
某次 DSH 升级后静默失效——选择器匹配不到任何消息，整条美化链路全部不执行，而页面上
看不出任何报错。

现在按形状匹配（`_markdown_<hash>_<n>`）并用块级子节点把同名的**文件类型图标**排除掉，
另保留 `[data-role="assistant"]` 等显式标记退路。

### 其他修复

- 新建/复制预设后同步刷新预设绑定与 DOM 标签，修复「新建预设后添加角色卡/世界书
  写进了另一个预设」

> ⚠️ 配套版本：本版需配合 **dsh-muv-engine 0.3.4** 与 **dsh-muv-table 0.2.6**。

## 📜 许可证

Copyright (c) 2026 chen731215-dev

本项目采用 **PolyForm-Noncommercial-Copyleft-1.0.0** 协议。
- ✅ 免费用于非商业用途
- ✅ 修改后必须使用相同协议开源
- ❌ 商业用途需要单独授权

完整协议文本见 [LICENSE](./LICENSE)。

## 🔗 伴生插件

| 插件 | 说明 |
|------|------|
| [dsh-muv-table](https://github.com/chen731215-dev/dsh-muv-table) | MUV 变量表格编辑器 |
| [dsh-muv-engine](https://github.com/chen731215-dev/dsh-muv-engine) | MUV 正则引擎 + 变量追踪 |

---

## 📦 v2.3.0 更新（2026-08-31）

- 🎯 **状态栏移到消息底部**：世界/状态/状况/sese 状态卡渲染后统一追加到消息末尾（虚线分隔），剧情正文在前
- 🎯 **选项交互修复**：剧情选项点击改为 document 级事件委托（永不失效），输入框查找增强
- 🐛 **转义标签还原**：`&lt;choices&gt;` / `&lt;Drama&gt;` / `&lt;style&gt;` 等转义形态还原成真实标签再渲染，不再裸奔显示
- 🐛 **预设单一事实来源**：编辑器/选择栏/MUV 表格永远读同一份权威数据，保存后从磁盘重建描述、孤儿预设自动清理
- 🎨 **CSS 统一 DSH 变量**：背景/边框/文本/品牌色全部跟随主题

---

## 🚀 3 步开始

1. **安装**：DSH 插件市场搜索 `dsh-tavern` 安装，重启 DSH
2. **导入**：设置 → 酒馆管理 → 把角色卡 PNG/JSON 拖进去
3. **开聊**：点「💾 保存并注入」，直接开始聊天

AI 会自动读取角色卡和世界书，不需要手动贴设定。

---

## ✨ 能做什么

### 核心功能
- 🎭 **角色卡管理** — 支持 SillyTavern 格式（PNG/JSON），多角色卡
- 📚 **世界书** — 智能关键词注入，全局条目常驻、角色条目按需触发，省 60% 上下文
- ⚙️ **多预设** — 每个会话独立保存角色卡/世界书，切换对话自动加载

- 🎭 **状态栏美化** — AI 回复中的「状态栏：」格式自动渲染为紫色状态卡（日期/时间/地点/用户列表）
- ✂️ **<content> 清理** — 自动剥离 AI 输出中的 <content> 草稿容器标签，正文干净
- ➕ **新建空白预设** — 新建预设默认完全空白（不复制上一个预设），另有一键「复制当前预设」

### 可选功能（默认折叠）
- 🧠 **记忆总结** — 手动/自动总结对话，AI 能看到之前的剧情
- 🔗 **角色关系网** — 总结时自动提取角色关系，可视化图谱
- 🎬 **剧情选项** — AI 每次回复输出 3 个选项，点击继续
- 🔥 **成人模式** — 强破限注入，需搭配成人词条预设使用

---

## 📦 安装

### 方法一：插件市场（推荐）
1. 打开 DSH 设置 → 插件
2. 搜索 `dsh-tavern`
3. 点击安装，重启 DSH

### 方法二：npm
```bash
dsh plugin add dsh-tavern
```

### 方法三：本地
下载源码复制到 DSH 插件目录，重启 DSH。

---

## 🎮 使用指南

### 1️⃣ 在酒馆面板设置角色卡 / 世界书 / 预设

打开 **设置 → 酒馆管理**，你会看到三个卡片区：

| 区域 | 作用 | 操作 |
|---|---|---|
| 🎭 **角色卡** | 定义角色的人设、性格、说话方式、首条消息 | 拖入 **PNG / JSON** 角色卡文件（SillyTavern 格式），可导入多份 |
| 📚 **世界书** | 定义世界观、场景、NPC、规则（按关键词触发省 token） | 拖入 **JSON** 世界书文件，或点「＋ 新增条目」手动建 |
| ⚙️ **预设** | 预置写作风格、破限词条、行为模块 | 拖入 **JSON** 预设文件，或点「＋ 新增条目」手动建 |

**保存**：三个区域的内容会自动写入当前预设的目录文件，无需手动保存。

> 💡 **新建空白预设**：点「＋ 新建」创建的是**完全空白**的预设（无任何角色卡/世界书/词条），方便从零搭建；想基于现有预设改造就点「⧉ 复制」。

### 2️⃣ 生成 Agent 预设

角色卡/世界书/预设设置好后，该预设就是一个完整的「Agent 预设」——它同时具备：

- **DSH 原生 Agent 预设**：在 DSH 聊天顶部的预设选择器里可见、可选
- **酒馆注入内容**：角色卡文本、世界书条目、预设词条会在每次请求时自动注入系统提示

> 切换「完整角色卡本体」请用**聊天顶部预设选择器**选择后**新开会话**；酒馆面板里的下拉只让 世界书/记忆/关系网 跟随。

### 3️⃣ 新建聊天并选择 Agent 预设

1. 点 **＋ 新会话**（新建一个聊天）
2. 在**聊天顶部的预设选择器**里，选中你要用的 Agent 预设（比如刚才配好的那个）
3. 开始聊天——AI 会自动读取该预设的角色卡/世界书/词条，无需手动粘贴设定

> ⚠️ **关键**：Agent 预设是在**会话创建时**绑定到聊天的（DSH 事件流记录）。所以**先选预设，再开始聊**。

### 4️⃣ 对已经生成的聊天修改角色卡/世界书，会有什么效果？

这是最容易困惑的一点，说清楚：

| 操作 | 对已有聊天的影响 |
|---|---|
| **修改角色卡**（如改人设、加描述） | ✅ **立即生效**：下一次生成回复时，AI 会用新角色卡。但**历史已生成的消息不变**（不会重写） |
| **修改世界书**（加条目、改关键词） | ✅ **立即生效**：后续请求按新世界书注入。历史消息不变 |
| **修改预设词条**（加破限、改风格） | ✅ **立即生效**：后续生成用新词条 |
| **切换当前会话绑定的预设** | ⚠️ 需在**聊天顶部选择器**切换（会写 DSH 事件流）；酒馆面板的下拉只影响 世界书/记忆/关系网 跟随 |
| **删除/重命名预设** | ⚠️ 已绑定该预设的会话：删除后绑定失效（回退默认）；重命名不影响绑定（按 id 绑定） |

**一句话总结**：**修改角色卡/世界书/预设 = 对后续生成即时生效，历史消息保持不变**。

### 5️⃣ 使用建议

- **想保持角色一致性**：建好角色卡后尽量少改；要调整时直接改酒馆面板，下一次回复就生效，不用重开聊天
- **想开新剧情/新角色**：用「＋ 新建」建空白预设，配新角色卡，**新开会话**选择它——老会话的角色不受影响
- **角色卡和世界书分开管理**：角色卡管"是谁"，世界书管"世界长什么样"，分开维护更清晰
- **记忆让剧情连贯**：配合「记忆总结」功能，AI 会记住之前的剧情，修改角色卡后依然保持连贯
- **成人内容**：在酒馆面板启用「成人模式」，并搭配成人词条预设（如破限词条）使用

---

## 📖 详细教程

见 [TUTORIAL.md](TUTORIAL.md) — 包含世界书配置、记忆总结、NSFW 写法、预设管理等详细说明。

---

## 📄 许可协议

**PolyForm-Noncommercial-Copyleft-1.0.0**（源码公开 / 非商业共享）

Copyright (c) 2026 chen731215-dev

- ✅ 免费用于任何非商业用途（个人学习、研究、使用、修改、非商业分发）
- ✅ 可以自由修改，但修改后的衍生作品必须以相同协议开源（Copyleft）
- ❌ 禁止任何商业用途（含收费、广告、接外包、打赏变现等）；商业用途需向作者单独获取授权
- 📝 分发时必须保留版权声明与协议全文，不得移除或更改

完整协议文本见 [LICENSE](./LICENSE)。

> 因含非商业条款，不符合 OSI 对"开源软件"的严格定义，准确表述为"源码公开 / 非商业共享"。

作者：chen731215 | 仓库：https://github.com/chen731215-dev/dsh-tavern-v2
