# dsh-diagrams [English](README.md) | 中文 DeepSeek Harness Web GUI 的 mermaid 图示渲染:会话正文或文档预览面板里的 mermaid 代码块会原地渲染成 SVG 图,而不是留成代码块。 ## 功能 - **在你阅读的地方出图**:会话正文与文档预览面板由同一个观察器覆盖——两者都走官方的同一个 markdown 组件。 - **按需加载**:mermaid 运行库由本包自己的宿主路由伺服,只有在页面真的出现 mermaid 块时才拉取,因此没有图示的会话不会多下载任何东西。 - **跟随界面主题**:明暗切换时按保存的源码重绘——mermaid 把颜色画进 SVG 本身,CSS 改不动它。 - **绝不破坏文档**:运行库缺失、围栏还在流式写入、或图示被解析器拒绝,都会把原代码块原样留下;代码块的复制按钮仍复制源码。 ## 安装 ```sh dsh plugin --profile web add @linxin666/dsh-client-ui-diagrams # 重启 dsh web dsh web ``` 安装全家桶(`@linxin666/dsh-web-all`)会一并挂载本包;该行出厂默认开启,可在插件管理里按行关闭。 ## 配置 没有设置项。本包只注册一条只读宿主路由与一个页面侧观察器,没有可配置项。 ## 已知限制 - **接入点是渲染器的 DOM,不是契约**:官方 markdown 渲染器没有代码块扩展缝,因此本包用 `md-code-block` 类名找围栏块、从 banner 的 infostring 元素读围栏语言。宿主若改名其一,渲染会停止(围栏退回普通代码块,不会出错);被钉住的常量集中在 `src/core/contract.ts`,旁边有契约测试。 - **流式围栏会延后出图**:回复仍在流式写入时,未闭合的围栏无法渲染。被拒的围栏只在短暂静默期之后、且源码确实变化时才重试,因此半截的图不会随每次 DOM 变更反复重解析,解析器拒绝的围栏也不会再被解析。 - **不提供图示主题选择**:图跟随界面的明暗状态,mermaid 自身的主题变量没有暴露成设置项。 ## 安全模型 - vendor 路由(`/api/dsh-diagrams/vendor/mermaid.js`)先过家族信任围栏:本机(loopback)恒通过;在装 `dsh-remote-web-ui` 时,已配对设备的 cookie 是额外的远程放行路径。其它客户端在读资产之前就被 403 拒绝。 - 路由只读:只应答 `GET` 与 `HEAD`,其余方法 405。 - 运行库同源来自已安装的包,不访问任何 CDN。 - 渲染出的 SVG 在 mermaid 自身 strict 等级之外再走一遍消毒:可执行元素、`on*` 事件属性与 `javascript:` URL 一律剥除;清理后仍带可执行 token 的标记被拒——该块保持为代码块。