🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

气泡 Markdown 渲染 DDDMUC/dsh-markdown-bubble

DeepSeek Harnessv0.1.4
DDDMUC11 天前有提交已提供中文文档扫描:未发现敏感能力

DeepSeek Harness 用户消息 Markdown 渲染插件 —— 你发出去的每一条消息,都按…

32.9/100
综合分
4
GitHub 星标
363
npm 周下载
—/5
用户评分

数据截至 2026/10/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-markdown-bubble
npm 源 · dsh-markdown-bubble 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · chat
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功(非静态推断);本次验证针对插件 v0.1.5,当前版本为 v0.1.4
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 11 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-markdown-bubble @ 0.1.4
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/10 15:48:46

安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

写入剪贴板(不计风险)
查看扫描证据(共 1 处,展示前 1 条)
  • 写入剪贴板
    src/client.js:604
    primitives.writeClipboard(text).then((ok) => {
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 保留引用标签与附件

DeepSeek Harness 已发送消息的 Markdown 渲染:用户与引导聊天气泡通过宿主自带的 Markdown 管线渲染标题、列表、代码、表格、数学公式和引用,引用标签、附件和操作栏保持原样。

v0.1.52026-10-23
0.1.5 —— 按 DSH 0.2.1-rc.2 的新契约移植,并把 engines.dsh 从开口的 >=0.2.0-rc.1 收成 >=0.2.1-rc.2(旧区间会让它在 0.2.1 上照样安装、只静默降级)。 - 引用 chip 回来了:primitives.projectUserText 在 0.2.1 被删除(真机报 TypeError: primitives.projectUserText is not a function),投影改成调用宿主的文本工厂槽 conversation.user.text(facts.sessionLabels / facts.skillNames + interactive),chip 拆分逻辑不变。真机复验:控制台里那条降级告警不再出现(0 条),25/25 条用户气泡仍由本插件渲染。 - 图片附件回来了:座位 props 里的 renderMessageImages 已不存在,改调图片画廊工厂槽 conversation.images.content(附件插件自己注册的那个;它的 MessageImages 也只是这一步调用)。三条看起来更顺的路都被堵着,README 的「兼容性」一节记了实测报错原文。 - 性能:降级投影从「每帧算两次」改成只算一次(MarkdownBoundary 的 fallback 改成惰性 thunk,只有真失败时才构造);toMarkdown() 加 64 条 LRU 缓存(流式期间同一条消息会被反复重排,而准备源码是 split/join + 逐行正则);传给 MarkdownText 的 labels 对象按 t 记忆化(宿主自己的 ReasoningContent 正是这么做的,每次新建对象会让下游 memo 失效)。
v0.1.42026-10-09
降级路径现在只有一个函数,不再是三份拷贝。“组合失败”“宿主投影抛错”和“最后兜底”各自都带了一份回退逻辑——一个调用宿主投影,一个内联纯文本——于是三处得靠手工保持同步。现在只剩 degradedBody():先试宿主自己的投影(保留引用 chip 和宿主渲染的其余部分),只有投影也抛错时才回退到纯文本。内容优先是这个函数约定的一部分:纯文本是最后一步,只有宿主自己拒绝投影时才会走到。新增回归测试:整个仓库里 projectUserText 只被调用一次,纯文本片段只在一处构造,所有降级调用方都走同一个函数——再写第二份降级拷贝,测试就会变红。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-markdown-bubble DeepSeek Harness 用户消息 Markdown 渲染插件 —— 你发出去的每一条消息,都按 Markdown 渲染。 标题、列表、加粗、行内代码、引用、代码块、表格与公式不再以源码形态躺在气泡里,而是经宿主自己的 Markdown 管线(MarkdownText)呈现;引用 chip、附件、时间/复制操作条与其它插件注入的按钮全部原样保留。实现方式是官方 keyed 槽位 conversation.chat.node 的 user / steering 座位替换,不修改 DSH 源码,不改写任何会话日志。 中文 · English ▲ 发出的 Markdown 按格式渲染;单换行保留为换行,代码块带宿主同款语法高亮卡 ▲ 操作条原样保留:时间、复制,以及 dsh-delete-turn / dsh-rerun-turn / dsh-edit-turn 注入的按钮 为什么需要它 DSH 的用户消息气泡按原样显示你输入的文字(white-space: pre-wrap):粘贴一段 README、写一段带列表的提示词、贴一段代码,都要先在脑子里解一遍 Markdown。助手回复有完整的 Markdown 管线,你自己的消息却没有。
展开完整文档(README 剩余 1 节)
dsh-markdown-bubble

DeepSeek Harness 用户消息 Markdown 渲染插件 —— 你发出去的每一条消息,都按 Markdown 渲染。 标题、列表、加粗、行内代码、引用、代码块、表格与公式不再以源码形态躺在气泡里,而是经宿主自己的 Markdown 管线(MarkdownText)呈现;引用 chip、附件、时间/复制操作条与其它插件注入的按钮全部原样保留。实现方式是官方 keyed 槽位 conversation.chat.node 的 user / steering 座位替换,不修改 DSH 源码,不改写任何会话日志。

中文 · English

▲ 发出的 Markdown 按格式渲染;单换行保留为换行,代码块带宿主同款语法高亮卡

▲ 操作条原样保留:时间、复制,以及 dsh-delete-turn / dsh-rerun-turn / dsh-edit-turn 注入的按钮

为什么需要它

DSH 的用户消息气泡按原样显示你输入的文字(white-space: pre-wrap):粘贴一段 README、写一段带列表的提示词、贴一段代码,都要先在脑子里解一遍 Markdown。助手回复有完整的 Markdown 管线,你自己的消息却没有。

这个插件把你这一侧的气泡也接到同一条管线上:

- 标题、列表、有序列表、任务列表、加粗 / 斜体 / 删除线、行内代码;
- 围栏代码块(宿主同款语法高亮与复制 / 换行工具条)、引用、分割线;
- 表格(宽表可横向滚动)、链接、图片、KaTeX 公式、脚注;
- 单换行保留为换行(GFM 语义会把 第一行\n第二行 合并成一段,聊天里没有人希望这样)。

特性

- 官方座位替换 —— 经 ctx.slots 在 conversation.chat.node 的 user / steering 两个 keyed 座位上以 priority: -1 遮蔽宿主渲染器;停用/卸载即恢复宿主自己的气泡,不改源码、不动日志
- 宿主同款渲染 —— 不自己造 Markdown 管线,直接调用 @deepseek-ai/dsh-client-ui-primitives 的 MarkdownText:与助手回复同一套解析、高亮、表格、公式与代码卡
- 引用 chip 保留 —— 调用宿主自己的文本工厂槽 conversation.user.text(0.2.1 起投影就住在那里),返回的片段按 chip / 纯文本拆分:chip 仍是可点击的文件 / 技能 chip,纯文本段逐个进 Markdown
- 操作条与三方插件兼容 —— 时间 + 复制按钮用官方 primitives 重建,操作条保留 _actions / _action 类名后缀与 data-clock 锚点;dsh-edit-turn、dsh-delete-turn、dsh-rerun-turn 的按钮注入照常工作
- 附件与补充块 —— 图片走官方的图片画廊工厂槽 conversation.images.content,文件卡、引用摘要、JsonBlock 补充块与宿主同款
- 软换行保留 —— 仅对围栏代码之外的续行补 GFM 两空格硬换行;代码块一个字节不动,缩进代码与表格行不误伤
- 出错兜底 —— 单条消息的渲染错误被错误边界接住,回退为宿主的原始投影,不会连累整条座位被槽位机制摘除
- 中英双语 随系统语言切换(代码卡文案复用宿主 chat 字典)

安装

npm 安装(web profile)
dsh plugin --profile web add dsh-markdown-bubble

本地工作区(开发)
dsh plugin --profile web add link:/path/to/dsh-markdown-bubble

dsh plugin add 会把依赖写进 profile 并把包追加到 dsh.profile.bundles。实测宿主随即扫描到新行、浏览器端热挂载,无需重启;若你的宿主版本未热载,重启 DSH 进程后刷新页面即可。

使用

安装即生效,无命令、无设置项。发一条带 Markdown 的消息即可看到渲染结果:

标题

- 列表 加粗
- 第二项 行内代码

引用一行 js const a = 1

排队中的消息预览、输入框本身与 goal 面板保持纯文本(见「已知限制」)。

工作原理

1. 座位遮蔽:浏览器半区 ctx.slots.inject('conversation.chat.node', …) 注册 user 与 steering 两个 keyed 条目,priority: -1 低于宿主默认的 0(同 key 同优先级会抛错,最低者渲染)。
2. 内容拆分:从节点数据取 content,按宿主 UserStyleBubble 的同一规则拆成文本 / 图片附件 / 文件卡 / 剩余块。
3. chip 感知的 Markdown 合成:调用宿主投影 projectUserText,把返回片段分成 chip 与纯文本;纯文本段逐个经 MarkdownText 渲染,chip 原样成为可点击元素。
4. 源码预处理:CRLF 归一、会话回顾 wire 链接(@label)还原为显示名、围栏代码之外的续行补两空格硬换行。
5. 外壳复用:行、堆栈、气泡、文件卡的度量值逐条对齐宿主样式表(MessageItem.module.css、MessageIconActions.module.css),颜色全部走主题 token;操作条在 DOM 序中前置,用 flex order 还原视觉顺序——这样三方插件 querySelector('[class="_actions"]') 的首个命中永远是消息操作条,而不是气泡内代码卡的工具条。

已知限制

- 待确认气泡不覆盖:本地回声与待发送 steering 由宿主 PendingSubmissionBubble / PendingSteeringBubble 直绘,不走 chat-node 座位,仍是纯文本;消息落盘后即切换为 Markdown。
- 队列预览不覆盖:排队消息的一行预览与 goal 命令行保持纯文本。
- 行内 chip 的折衷:chip 打断连排段落时,该段会拆成 chip 两边的块(与社区同类实现相同的取舍);chip 在段首/段尾的常见情形无缝。
- 皮肤边界:若某个皮肤直接针对宿主 CSS-module 类名定制用户气泡样式,不会命中本插件的气泡;主题 token 与 .dshmb- / .dshmb_ 自定义样式正常生效。
- 多行语义:单换行按硬换行渲染;连续空格、Tab 缩进等 Markdown 忽略的空白会被折叠(代码块内除外)。

兼容性

- 实测 DSH 0.2.1-rc.2(web profile,Chromium)。依赖:keyed 槽位 conversation.chat.node(user / steering)、座位上的 renderFactorySlot 绑定、行锚点 data-chat-flow-kind / data-pending-steering / data-submission-echo、primitives 导出的 MarkdownText / writeClipboard。
- 0.2.1 把扩展点往里挪了,本插件 0.1.5 已按新契约移植(旧契约的三样东西都不在了):primitives.projectUserText 被删除 → 改调文本工厂槽 conversation.user.text;座位 props 从 { node, renderMessageImages, openFile, openSkill, t } 变成 { node, renderFactorySlot, loadImage, t } → 图片改调图片画廊工厂槽 conversation.images.content。
- 为什么不能去换内容工厂槽:conversation.chat.user.content 由宿主注册,插件再注册同名工厂会让宿主自己的聊天插件启动失败(实测 web boot: 1 entry did not activate @deepseek-ai/dsh-client-ui-chat: failed),所以「只换气泡内部」这条路走不通;同理,conversation.chat.user.images 这个子槽也不能由插件声明(实测 slot "conversation.chat.user.images" is already declared (by factory "conversation.chat.user.content"))。座位替换 + 两个工厂槽调用是当前版本唯一可行且不伤宿主的组合。
- 与 dsh-edit-turn、dsh-delete-turn、dsh-rerun-turn 协同:三者的按钮注入基于 [class="_actions"] / [class="_action"],本插件保留该契约;被 dsh-edit-turn 改写(rollback)的消息显示其自己的改写气泡,与本插件无关。
- 宿主半区为惰性入口(无运行时行为),全部逻辑在 ./client 浏览器半区;不修改官方源码,不写私有事件类型。

为什么现在不能换成「替换内容工厂」(B 方案)

理想做法是替换宿主的内容工厂槽 conversation.chat.user.content:气泡内部(附件 + 气泡 + 引用摘要)全部交回宿主,本插件只换掉正文那一段。这样能删掉自建的行外壳、时间/复制操作条与相关样式约 200 行,也不再依赖座位 props 的形状。现在做不了,卡在下面三条(都在 DSH 0.2.1-rc.2 上实测过;等哪天宿主放开了任意一条,就可以改成 B):

| 缺什么 | 实测结果 | 放开之后 |
| 工厂槽能被插件遮蔽/替换 | 注册同名工厂不是遮蔽而是硬错误,且会让宿主自己的聊天插件启动失败:web boot: 1 entry did not activate @deepseek-ai/dsh-client-ui-chat: failed | 直接换成注册 conversation.chat.user.content,删掉自建行外壳与操作条 |
| 子槽能由多个声明方共享 | 想让座位条目自己声明 conversation.chat.user.images 以拿到 renderSlot,被拒:slot "conversation.chat.user.images" is already declared (by factory "conversation.chat.user.content"),且整条注册一起失败 | 图片可以用官方的座位/子槽渲染,不必绕工厂槽 |
| 有一个公开的「渲染一条用户消息」入口 | 0.2.1 删掉了 primitives.projectUserText,投影只存在于工厂槽内部(现在只能调 conversation.user.text / conversation.images.content 这两个工厂槽) | 插件插入的气泡(例如 dsh-edit-turn 改写后的提示词)也能走同一条管线,见 deepseek-harness#10704 |

也就是说:座位替换(A)+ 调两个工厂槽是当前版本唯一不伤宿主的组合;上面三条任意一条放开,都可以迁到 B。

修复记录

- 0.1.5 —— 按 DSH 0.2.1-rc.2 的新契约移植,并把 engines.dsh 从开口的 >=0.2.0-rc.1 收成 >=0.2.1-rc.2(旧区间会让它在 0.2.1 上照样安装、只静默降级)。
- 引用 chip 回来了:primitives.projectUserText 在 0.2.1 被删除(真机报 TypeError: primitives.projectUserText is not a function),投影改成调用宿主的文本工厂槽 conversation.user.text(facts.sessionLabels / facts.skillNames + interactive),chip 拆分逻辑不变。真机复验:控制台里那条降级告警不再出现(0 条),25/25 条用户气泡仍由本插件渲染。
- 图片附件回来了:座位 props 里的 renderMessageImages 已不存在,改调图片画廊工厂槽 conversation.images.content(附件插件自己注册的那个;它的 MessageImages 也只是这一步调用)。三条看起来更顺的路都被堵着,README 的「兼容性」一节记了实测报错原文。
- 性能:降级投影从「每帧算两次」改成只算一次(MarkdownBoundary 的 fallback 改成惰性 thunk,只有真失败时才构造);toMarkdown() 加 64 条 LRU 缓存(流式期间同一条消息会被反复重排,而准备源码是 split/join + 逐行正则);传给 MarkdownText 的 labels 对象按 t 记忆化(宿主自己的 ReasoningContent 正是这么做的,每次新建对象会让下游 memo 失效)。
- 0.1.4 —— 按评审意见把降级路径合成一个函数:此前「合成失败」「宿主投影抛错」「最后兜底」各自写了一份降级逻辑(一份调宿主投影、一份内联拼裸文本),三处要人工保持同步。现在只有 degradedBody() 一处:先试宿主自己的投影(保住引用 chip 等宿主渲染),投影也抛才退到裸文本;三条降级路径全部走它。内容优先这一点写进函数契约:裸文本是最后一步,只有宿主自己拒绝投影时才到。新增回归:断言 projectUserText 全仓只有一次调用、裸文本 span 只有一处构造、降级调用方都走同一函数(再造一份降级该测试转红)。
- 0.1.3 —— 把「座位 render 绝不抛」这条不变式补完:0.1.2 守住了合成与文案查询,但仍有形状会在座位自己的渲染里抛错(node 缺失 → node.data、props 缺失 → 解构本身、new Date(time) 遇到 Symbol / BigInt / 抛错的 valueOf、宿主图片渲染器抛错)。这些同样冒泡到槽位机制、退掉整条条目,症状与 0.1.2 修的完全一样。现在三层兜底:座位本体一层 try 并把 node / data 的取用改成防御式;时钟与附件卡在各自调用点兜底;最后一层 renderPlainRow 保证最坏情况只是这一行退回纯文本,而操作条与兄弟插件锚点仍在。新增回归:21 种恶意宿主形状逐一断言不抛、且行与操作条都在。
- 0.1.2 — 座位组件不再可能因渲染期异常被槽位机制摘除:composeUserMarkdown / buildMarkdownLabels 在座位渲染过程中运行,抛错不会被错误边界接住(错误边界只能接住其后代,接不住创建它的那次渲染),会冒泡到槽位机制并把该条目整条退掉——屏幕上就是气泡交还给宿主、Markdown 变回源码。现在合成与所有文案查询都在座位内部兜底:任何宿主形状不符(节点结构异常、投影返回不可识别、locale 席位不可调用)都退回宿主原始投影,气泡外壳、操作条与兄弟插件锚点全部保留。data.content 非数组、t 不可调用等情形一并加进回归测试。
- 0.1.1 — 修复两个引用 chip 之间只有空白时该空白被当作空 Markdown 块丢弃的问题:相邻 chip 不再粘成 @a@b,chip 之间的换行也按宿主 pre-wrap 气泡的样子保留为换行(空白段渲染为 data-dshmb-gap 的预换行节点,仍不产生空 Markdown 块);自建的操作条 / 复制按钮补上 data-dshmb-actions / data-dshmb-action 命名空间标记;座位优先级 -1 的宿主依据(宿主默认 0、最低者渲染、同优先级抛错)与三个兄弟插件依赖的锚点结构一并加进回归测试。

License

MIT

DeepSeek Harness 已发送消息的 Markdown 渲染 —— 你发出的每条消息都按 Markdown 渲染。 标题、列表、加粗、行内代码、引用、代码围栏、表格和数学公式不再以源码形式躺在气泡里,而是走宿主自己的 Markdown 管线(MarkdownText)渲染;引用 chip、附件、时钟 / 复制操作条,以及兄弟插件注入的按钮,全都留在原位。做法是遮蔽 conversation.chat.node 官方的 user / steering 键控座位 —— 不改 DSH 源码,不重写会话日志。

为什么你需要它

DSH 会原样显示你自己发的消息(white-space: pre-wrap):粘贴一段 README、写一条带列表的提示词、贴一段代码,你都得先在脑子里解析 Markdown。助手回复走完整渲染流程,你这边没有。这个插件把你这边也接进同一条流程:标题、列表、任务列表、粗体/斜体/删除线、行内代码、围栏代码块(带宿主的语法高亮和复制/换行工具栏)、引用、分隔线、表格(宽表格可滚动)、链接、图片、KaTeX 数学公式和脚注——单换行也保留为换行。

功能

- 替换官方席位 —— 通过 ctx.slots 在 conversation.chat.node 里以 priority: -1 注册 user 和 steering 两类键控条目;禁用或卸载后恢复宿主自己的气泡。不改源码,不写日志。
- 复用宿主自己的渲染器 —— 调用 @deepseek-ai/dsh-client-ui-primitives 的 MarkdownText,让用户消息和助手共用同一条流程:同样的解析、高亮、表格、数学公式和代码卡片。
- 引用 chip 仍是 chip —— 照常调用宿主投影(projectUserText),拆成 chip 和纯文本片段;chip 保留点击目标,每段纯文本变成一个 Markdown 块。
- 操作条与兄弟插件兼容 —— 时钟和复制按钮用导出的基础组件重建;操作条保留 _actions / _action 类名后缀,以及 dsh-edit-turn、dsh-delete-turn、dsh-rerun-turn 查找的 data-clock 锚点。
- 附件与额外块 —— 图片走官方 conversation.message.images 席位(renderMessageImages);文件卡片、引用摘要和 JsonBlock 额外内容与宿主一致。
- 保留软换行 —— 围栏代码之外的续行按 GFM 规则补两个空格变成硬换行;代码逐字节保留,缩进代码和表格行不动。
- 崩溃隔离 —— 每条消息一个错误边界,出错时回退到宿主的纯文本投影,而不是让槽位机制把整个席位下线。
- 双语 文案跟随当前语言环境(代码卡片外壳复用宿主的 chat 字典)。

安装

from npm (web profile)
dsh plugin --profile web add dsh-markdown-bubble

local workspace (development)
dsh plugin --profile web add link:/path/to/dsh-markdown-bubble

dsh plugin add 会把依赖写进配置档,并把包追加到 dsh.profile.bundles。测试中宿主实时识别到新条目,浏览器热挂载,无需重启;如果你的宿主版本不支持热加载,重启 DSH 再刷新页面。

用法

安装后直接发 Markdown——不用命令,不用设置。冒烟测试:

Heading

- list with bold
- second item inline code

a quote
js
const a = 1

排队消息预览、输入框本身和目标面板仍是纯文本(见限制)。

工作原理

1. 座位遮蔽 — 浏览器端在 conversation.chat.node 下注册 user 和 steering 两个带键条目,priority: -1,低于宿主的默认值 0(同一键、同一优先级会抛错;优先级最低者渲染)。
2. 内容拆分 — 节点的 content 完全按宿主 UserStyleBubble 的方式拆分:文本、图片附件、文件卡片、剩余块。
3. 感知 chip 的 Markdown 组合 — 宿主投影拆成 chip 和纯文本段;每个纯文本段经 MarkdownText 渲染,chip 保持为可点击元素。
4. 来源预处理 — CRLF 归一化;会话召回线链接(@label)缩减为显示标签;围栏代码之外的续行加两个空格硬换行。
5. 外壳对齐 — 行、堆叠、气泡、文件卡片的度量从宿主样式表(MessageItem.module.css、MessageIconActions.module.css)复制,颜色仍用主题 token;操作条在行的 DOM 顺序中排最前,再用 flex order 还原视觉顺序,因此兄弟插件的 querySelector('[class="_actions"]') 总能命中消息栏——绝不会命中气泡内代码卡片的工具栏。

已知限制

- 未覆盖待定气泡:本地提交回显和待定 steering 气泡由宿主直接绘制(不走 chat-node 座位),在消息落地前保持纯文本。
- 未覆盖队列预览:单行队列预览和目标命令行保持纯文本。
- 行内 chip 的取舍:chip 打断正在排版的段落时,该段落会在 chip 两侧拆成块(社区实现也是同样取舍);边界处的 chip 无缝。
- 皮肤边界:直接给宿主 CSS-module 气泡类写样式的皮肤不会命中本插件的气泡;主题 token 和 .dshmb- / .dshmb_ 自定义样式有效。
- 多行语义:单个换行渲染为硬换行;Markdown 忽略的空白(连续空格、Tab 缩进)在代码块外被折叠。

兼容性

- 已在 DSH 0.2.0-rc.1(web 配置档,Chromium)验证。依赖带键的 conversation.chat.node 槽位、data-chat-flow-kind / data-pending-steering / data-submission-echo 行锚点,以及原语导出 MarkdownText / projectUserText / writeClipboard。
- 可与 dsh-edit-turn、dsh-delete-turn、dsh-rerun-turn 共存:它们的注入依赖 [class="_actions"] / [class="_action"],本插件保留这些选择器。被 dsh-edit-turn 改写(回滚)的消息显示该插件自己的替换气泡,不在本插件范围内。
- 宿主端是惰性入口(无运行时行为);一切都在 ./client 浏览器包中。不修改任何官方源码,不写入私有事件类型。

修复

- 0.1.4 — 按审阅者的要求,把各条降级路径合并成一个函数:组合失败、宿主投影抛异常、最后兜底这三处原本各带一份副本(一份调用宿主投影,一份内联拼出原始文本 span),全靠手工同步。现在只有一个 degradedBody():先尝试宿主自己的投影,这样引用 chip 和宿主自己的内联片段都能保留;只有投影本身抛异常时,才降级到原始文本。内容优先现在是这个函数的约定:原始文本是最后一步,只有宿主拒绝投影时才会走到。新增回归测试:整个文件里 projectUserText 只调用一次,原始文本 span 只构造一次,所有降级调用方共用这个函数(再引入第二份副本,测试就会变红)。
- 0.1.3 — 补全「座位渲染永不抛异常」这条不变量:0.1.2 守住了组合和文案查找,但形状在座位自己的渲染里仍会抛异常(node 缺失 -> node.data,props 缺失 -> 解构本身,Date 构造函数拒绝的 time —— Symbol、BigInt、会抛异常的 valueOf —— 以及会抛异常的宿主图片渲染器)。每次异常都逃到插槽机制,把条目摘掉,症状和 0.1.2 修的一样。现在有三层:座位主体外面包一层 try,并对 node / data 做防御性访问;时钟和附件卡片各自按调用加守卫;再加一个最后兜底的 renderPlainRow,最坏情况就是一行回退成纯文本,操作条和兄弟锚点都完好。回归测试:21 种恶意宿主形状,逐一断言不抛异常,且行和操作条都保留。
- 0.1.2 — 座位组件不会再因为渲染期异常被摘掉:composeUserMarkdown / buildMarkdownLabels 在座位渲染时运行,那里抛出的异常不会被错误边界捕获(边界捕获的是它的后代,不是创建它的那次渲染)—— 异常逃到插槽机制,整个条目被丢弃,行交回宿主,气泡在屏幕上退回原始源码。现在组合和每次文案查找都在座位内部降级:任何宿主形状不匹配(意外的 node、无法识别的投影结果、不可调用的 locale 座位)都回退到宿主的普通投影,同时气泡外壳、操作条和兄弟插件锚点保持完好。data.content 不是数组、t 不可调用,这两种情况都有回归测试覆盖。
- 0.1.1 — 修复了两个引用 chip 之间只有空白的纯文本段被当作空 Markdown 块丢弃的问题:相邻 chip 不再粘连成 @a@b,两个 chip 之间的换行也保持为换行,与宿主 pre-wrap 气泡的显示效果一致(该文本段渲染为 data-dshmb-gap 的 pre-wrap 节点,仍然绝不会是空 Markdown 块);自行创建的操作条和复制按钮现在带有 data-dshmb-actions / data-dshmb-action 命名空间标记;priority: -1 背后的宿主证据(宿主默认值为 0,最低值最后渲染,相同优先级会抛错)以及三个同级插件依赖的锚点结构,都已纳入回归测试覆盖。

License

MIT
预览分享卡片长什么样 ↓DDDMUC/dsh-markdown-bubble
分享 · DeepSeek Harness Hub
DDDMUC/dsh-markdown-bubble

DeepSeek Harness 用户消息 Markdown 渲染插件 —— 你发出去的每一条消息,都按…

这是你的仓库?认领条目

回到顶部