dsh-markdown-bubble:DeepSeek Harness 用戶消息 Markdown 渲染插件

DeepSeek Harness(DSH)的設計理念是“一切皆插件”。在默認情況下,助手回覆的消息會經過宿主完整的 Markdown 渲染管線,而用戶發出的消息通常保持 white-space: pre-wrap 的源碼形態。這導致在對話界面中,消息格式不統一,開發者閱讀或調試時需要額外解析 Markdown 語法。

dsh-markdown-bubble 是一個客戶端插件,旨在將用戶消息接入宿主同款的 Markdown 渲染管線。它通過官方的 keyed 槽位機制替換 conversation.chat.node 中的 user 和 steering 座位,在保持宿主樣式和操作條兼容的前提下,實現用戶消息的格式化顯示。

核心功能

  • 官方座位替換:通過 ctx.slots.inject 註冊 user 和 steering 座位,優先級爲 -1,停用或卸載後即恢復宿主默認渲染。
  • 宿主同款渲染:直接調用 @deepseek-ai/dsh-client-ui-primitives 的 MarkdownText,複用解析器、語法高亮、表格渲染和 KaTeX 公式支持,不重複造輪子。
  • 引用 chip 保留:調用宿主投影函數 projectUserText,將返回內容拆分爲 chip 和純文本,chip 保持可點擊狀態。
  • 操作條與三方插件兼容:重建時間與複製按鈕,保留 _actions / _action 類名後綴及 data-clock 錨點,確保 dsh-edit-turn、dsh-delete-turn 等插件正常工作。
  • 附件與補充塊支持:圖片走官方 conversation.message.images 座位,文件卡、引用摘要與 JsonBlock 補充塊與宿主保持一致。
  • 軟換行保留:僅對非圍欄代碼塊的續行補 GFM 兩空格硬換行,代碼塊內部字節保持原樣,表格和縮進代碼不受影響。
  • 出錯兜底:單條消息渲染錯誤會被錯誤邊界捕獲,回退爲宿主原始投影,防止整條座位被槽位機制移除。
  • 中英雙語切換:文案複用宿主 chat 字典,隨系統語言自動切換。

安裝與啓用

安裝過程依賴 DSH 的插件管理命令。安裝後即生效,無需額外的配置項。

dsh plugin --profile web add dsh-markdown-bubble

安裝命令會將依賴寫入 profile 並追加到 dsh.profile.bundles。宿主通常會立即掃描到新行並熱掛載,若未生效,重啓進程後刷新頁面即可。

典型用法

發一條包含 Markdown 語法的消息,氣泡內將按格式渲染。

# 標題

- 列表 **加粗**
- 第二項 `行內代碼`

> 引用一行
```js
const a = 1

```

注意事項與限制

  • 待確認氣泡不覆蓋:本地回聲與待發送 steering 由宿主 PendingSubmissionBubble / PendingSteeringBubble 直接繪製,不走 chat-node 座位,保持純文本。
  • 隊列預覽不覆蓋:排隊消息的一行預覽與 goal 命令行保持純文本。
  • 行內 chip 的折衷:當 chip 打斷連排段落時,該段落會被拆分爲 chip 兩邊的塊,這是同類實現的常見取捨。
  • 皮膚邊界:直接針對宿主 CSS-module 類名定製用戶氣泡樣式的皮膚不會命中本插件的氣泡,但主題 token 和 .dshmb-* 自定義樣式正常生效。
  • 多行語義:單換行按硬換行渲染,連續空格和 Tab 在代碼塊外會被 Markdown 摺疊(代碼塊內除外)。
  • 兼容性:插件依賴 conversation.chat.node keyed 槽位、data-chat-flow-kind 等屬性以及 MarkdownText / projectUserText 等接口。實測兼容 DSH 0.2.0-rc.1(web profile,Chromium)。

總結

該插件解決了 DSH 中用戶消息與助手消息渲染不一致的問題,通過不修改宿主源碼的方式,將用戶消息接入標準的 Markdown 管線。它保留了引用 chip 的交互能力,併兼容現有的操作條和第三方插件。安裝即用,適合需要在對話流中直接查看格式化內容的場景。

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

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

小夜