dsh-user-markdown:让 DSH Web GUI 里的用户消息也按 Markdown 渲染

前言

在 DeepSeek Harness(DSH)的 Web 界面里,模型回复默认会走 Markdown 渲染;用户自己发出的内容却长期以纯文本展示(white-space: pre-wrap)。你输入的 **重点**、`命令`、列表和围栏代码块,在历史气泡里仍是字面符号,回看会话时要自己在脑子里「预编译」一遍。

towardsdawn/dsh-user-markdown 是维护者 TowardsDawn 发布的客户端插件:只改浏览器端展示,让用户气泡与模型气泡在 Markdown 呈现上对齐。插件已在 DSH Market 收录,社区目录页见 SkillHub。

这是什么

dsh-user-markdown 是一个零依赖、无需构建的 DSH Web 客户端插件。它不修改会话数据、配置或模型上下文;加载与卸载仅影响 GUI 里用户消息的显示方式。

当前 package 版本为 1.0.2,许可证 MIT,面向 web 平台;package.json 要求 Node >=22.19.0,DSH 引擎 >=0.1.5-rc.1 <1.0.0。

核心功能

下面介绍 README 中已说明、且与实现一致的能力。

渲染范围

  • 持久用户消息、插话(steering)、乐观回显气泡均会渲染。
  • 支持标题(#~######)、粗体/斜体/删除线、行内代码与围栏代码块(无语法高亮,块顶显示语言标签或「代码块」)、链接、列表、引用、分隔线、表格、图片等常见 Markdown 语法。
  • 段内换行按硬换行(<br>)处理;对孤立 \r 等行为与 DSH 原生 pre-wrap 展示保持一致,避免渲染前后行结构不一致。

安全与主题

  • 文本先 HTML 转义;链接走协议白名单(http(s)、mailto、tel、相对路径、#),javascript:、data: 等会被降级。
  • 样式用中性半透明色,适配深浅色主题。

与其它插件共存

本插件不注册 conversation.chat.node 槽位,因此不会顶掉 dsh-easyrewrite、dsh-rewind-plugin 等替换用户气泡渲染器的插件。实现上通过 DOM 增强:在 React 渲染完成后,用 MutationObserver 找到符合条件的纯文本消息体容器,再插入渲染结果;含 @文件 引用 chip、附件块或编辑态(textarea / input / contenteditable)的气泡会跳过,避免破坏结构。

运行时控制

浏览器控制台提供一行开关,例如 window.__dshUserMarkdown.toggle();状态保存在 localStorage['dsh-user-markdown:enabled']。也可在 ~/.dsh/profiles/web/cordis.patch.yml 中将插件条目设为 disabled: true 从配置侧停用。

安装与启用

前置条件:系统 PATH 中有 dsh 与 pnpm(dsh plugin 会转发给 pnpm)。

先从 GitHub 安装到 web profile(拷贝式安装,仓库无需构建):

dsh plugin --profile web add "github:TowardsDawn/dsh-user-markdown"

安装过程会自动:把包装进 ~/.dsh/profiles/web、写入 dsh.profile.bundles、通过 cordis.patch.yml 接入装配树。完成后重启 DSH:

dsh web

验证装配是否包含本插件:

dsh --profile web --dump-config | grep dsh-user-markdown

在 GUI 的 DevTools 控制台确认客户端已挂载:

typeof window.__dshUserMarkdown        // "object"
window.__dshUserMarkdown.enabled()     // true

更新可用:

dsh plugin --profile web update dsh-user-markdown

卸载:

dsh plugin --profile web remove dsh-user-markdown

然后再次重启 dsh web。

典型用法

装上即生效,无需额外配置文件。

临时关闭或恢复 Markdown 显示(立即生效,刷新后仍按 localStorage 记忆):

window.__dshUserMarkdown.disable()
window.__dshUserMarkdown.enable()
window.__dshUserMarkdown.toggle()
window.__dshUserMarkdown.refresh()
window.__dshUserMarkdown.render('# 测试')

在输入框里写 Markdown 发送即可;安装前后对比可参考 README 中的示例:## 标题、列表与 `npm run build` 等在安装后会呈现为对应样式,而非字面反引号与星号。

适用场景与注意

适合:经常在用户消息里写结构化说明、命令、清单,希望在 Web 历史记录里直接可读,且可能与 easyrewrite、rewind 等气泡类插件同时使用的 DSH 用户。

局限(资料原文):

  • 含引用 chip / 附件块的消息不渲染(仅纯文本类气泡)。
  • 只影响 Web GUI;TUI / ACP 终端侧不生效。
  • 依赖 DSH 的 DOM 约定(如 data-chat-flow-kind="user" | "steering" 等);若上游改动属性,插件可能静默失效。

安装前建议:DSH 插件随当前 dsh 进程与用户权限运行。安装前请自行查看 GitHub 仓库 源码与 MIT 许可证,确认符合你的环境与安全要求。社区目录(SkillHub、DSH Market)为独立生态站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-user-markdown 补上了 DSH Web GUI「只渲染模型、不渲染用户」这一半体验:零构建、不抢槽位、不改数据,适合作为日常写 Markdown 用户消息的展示层增强。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye