sugarmaster666/dsh-persona-forge ↗★ 0

dsh-persona-forge

使用角色卡改写输入框草稿的语气和口吻 适合需要将输入文本自动润色改写为特定角色人设口吻的角色扮演玩家。

包名
dsh-persona-forge
兼容性
待验证
版本
0.3.1
许可证
MIT
最近更新
2026年10月9日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:sugarmaster666/dsh-persona-forge

使用

  1. 点输入框工具行的 🎭,选一个角色。列表最后的 「无角色」 可关闭改写 —— 这也是控件的初始状态,选择按会话记住。
  2. 设置强度和发送方式:
    • 强度是四档阶梯:轻 · 中 · 重 · 狂热(Light · Medium · Strong · Zealot)。轻=只加一点味道;中=明显但不喧宾夺主;重=语气充分,需求依然一眼可见;狂热=通篇仪式化。每张卡有自己的默认值,这里的选择会覆盖它。
    • 先审查 —— 改写结果显示在输入框下方的对比面板里;你看过之后按面板里的发送。在确认之前,你的草稿一字不动。
    • 直接发出 —— 改写完成后立即作为你的消息发出。面板会保留显示实际发出的内容,因为已发出的消息无法撤回。
  3. 选了角色之后,输入框原生的发送按钮、以及 Enter 键就是改写触发器。

菜单底部的 「更多设置」 默认收起,里面是改写方式与保真度 —— 它们是对卡片自身声明的按会话覆盖,多数人设一次就不会再动,所以不占主菜单。收起时若有覆盖,这一行会写出改了什么,不会让一个你忘了的选择藏在折叠后面。

同一份草稿只改写一次:改写结果落到输入框后,再按发送会原样发出,不会把改写结果再改写一遍。改动草稿会重新触发改写。

你的草稿会被保留:还原原文 可恢复,且会撤销"已改写"的记忆 —— 所以撤消后还能再改一次。仅回填 只把改写结果放进输入框而不发送。

发送拦截的原理与它唯一的风险

输入框的发送动作没有插件钩子:宿主那个按钮直接调用 shell 的提交方法,而且 Enter 根本不经过按钮 —— 编辑器自己的 keymap 直接提交。所以本插件拦截两条路径:

  • 输入框卡片上的点击,用无障碍名称识别发送按钮,标签取自 shell 自己的 conversation 语言命名空间("发送消息" / "排队发送" / "插话发送");
  • 输入框文本框内的 Enter 按下。

那是一个公开的、会翻译的字符串,而不是被哈希过的 CSS 类名;但它终究属于 shell 的 DOM 结构。所有判断都朝「放行原生发送」这一侧失败:语言服务缺失、找不到输入框卡片、按钮标签对不上、角色已关闭、草稿为空、草稿已改写 —— 任一情况插件都不干预,消息照常发出。Enter 拦截会忽略 Shift+Enter(换行)、输入法组字中,以及 shell 本身忽略的各种修饰键组合。

关闭插件会彻底移除拦截 —— 插槽组件卸载,监听器随之移除,输入框的行为与从未装过该插件完全一致。

最坏的现实后果是拦截静默失效、发送行为退回到"没装插件"的样子,而不是消息丢失或被篡改。

技术事实校验

改写最大的风险不是语气不像,而是把你的需求改没了。插件用两层检查覆盖它 —— 两层互补,不是重复:

第一层:本地检查 —— 永远运行,零成本。 在插件进程里比对草稿和改写结果的技术记号:标识符、文件路径、版本号、数字、--flag、API 这类缩写。丢了哪个就点名告诉你(「丢失:a.js」)。它不调用模型,所以不花 token、不加延迟,也关不掉。

第二层:模型校验 —— 默认关闭,菜单里可开。 每次改写多调用一次模型,只看本地检查根本看不到的东西:

  • 需求被换个说法悄悄改弱(词都还在,但要求变松了);
  • 在正文里用散文追加了一条约束。

代价是延迟和 token 都翻倍,所以默认关闭:最常见、最伤人的失败(丢掉文件名 / 数字 / 版本号)已经被本地检查免费证明了,为它每次发送都付一次模型调用是浪费。草稿偏技术时再开。

开关在设置 → 角色扮演(「开启模型校验」),是个全局偏好 —— 它回答的是「我要不要为第二次调用付费」,一次决定即可,不必在每次发送前重新问一遍。关闭时面板会写明「已做本地检查(不耗 token)」,并说清它没有覆盖什么 —— 一个窄的结论必须自己交代边界。

两层都是建议性的,绝不阻断改写:只标注,不拦你。


配置

写在插件加载行的 config 里:

- id: persona-forge
  name: dsh-persona-forge
  config:
    sendMode: review   # review | direct —— 输入框的初始默认
    factCheck: false   # 模型校验的默认值(默认关闭,见「技术事实校验」)。
                       # 本地技术记号检查不受这项控制 —— 它永远运行且免费。
    watchCards: true   # 角色卡目录变化时重载目录

factCheck 只决定第二层的默认值;菜单里的开关按会话覆盖它。设成 true 会让每次改写都多一次模型调用(延迟与 token 翻倍),只有草稿确实偏技术时才值得。