模型说「画一张卡片」,屏幕上就出现一个能拖滑块的东西。这段路常被当黑箱,却决定了卡片能做什么。从参数到像素,一共七层。
一 · 参数里只有一个字符串
能传的是 fragment、title、mode,只有 fragment 必需。它是片段不是文档:没有 <!DOCTYPE> 与 <body>,外壳已经在。
title 给卡片一个显示名。mode 三态:不传是默认卡片,宽度跟聊天栏走;wide 给并排比较;page 只留启动卡片(标题、一行 summary、缩略图、「打开页面」按钮),页面在新标签页打开。
path 只服务 update:不是输出路径,而是「指向哪张卡片」的定位符,新卡片传了会被忽略。落盘位置由会话 id、标题、hash、风格拼出来。
二 · fragment 先落盘
片段写进 ~/.dsh/visualize/sessions/<会话 id>/<标题>-<hash>.<style>.html,设了 DSH_HOME 就在其下。不写进项目目录,git status 不会冒 viz/。
卡片是会话的一部分:删项目不带走它。代价是插件不自动清理,要删就清 ~/.dsh/visualize/。
三 · iframe 的来源是空的
卡片跑在不透明来源的 sandboxed iframe 里,origin 为 null,脚本摸不到宿主的 cookie 与登录凭据。「在新窗口打开」也不是逃生门。
CSP 阻止网络请求、嵌套页面、表单提交,只允许固定 CDN 的静态资源;单个 fragment 默认上限 1,000,000 字节,可用 maxFragmentBytes 调整。
四 · 风格拆成两半
五种内置:whale 鲸蓝(默认)、editorial 报刊、paper 论文(色盲安全、「图 1 ·」图注)、sketch 手绘(rough.js)、terminal 终端(等宽、直角)。
分两层是关键:颜色、字体、圆角、图表默认值由外壳注入并适配明暗主题;版式与写法是一段风格说明,附在 skill 末尾给模型,只替换审美建议,CSP、主题变量和 lint 都不动。
自定义风格因此进的是说明层:~/.dsh/visualize/style.md 与工作区的 .dsh/visualize-style.md 改不了注入的颜色字体,优先级是对话里说的 > 工作区 > 全局 > 内置。
五 · 图片绕到服务端
模型写 <img data-viz-src="figs/loss.png">,插件在服务端取图,核对字节是 PNG/JPEG/GIF/WebP/SVG,存进 images/,渲染时以 data: URL 交给 iframe。绕一圈是因为 CSP 不放宽:data: 是内联数据,不触发网络。
边界很紧:工作区图片必须在会话工作区内,跟随符号链接之后也要在;网络图片只从公网下载,每次连接(含最多 3 次重定向)都在 DNS 解析后检查,loopback、内网、link-local 与 metadata 服务一律拒绝。
六 · update 只换一处
改卡片用 action: "update" 加 path 加一处 old_str → new_str。整段重发等于几千字再进一次上下文,改一个数字和重画一张卡代价一样。
七 · 状态落在 iframe 外面
拖过的滑块、勾的选项、填的字、选中的标签页,以及模型用 dshViz.state 存的选择,刷新、重开会话、update 后都会恢复。状态在 DSH 页面的 localStorage,键名以 dsh-visualize:state: 开头,按会话和卡片分开。
为什么不放卡片里?iframe 不透明,刷新就重建,里面一切清零,只能由宿主在外保存。换端口打开算另一个站点。每卡 16 KB、合计 256 KB,超了最久未改的先清。
几处容易踩空的地方
坑一 · 卡片里写了 fetch,画出来一片空白
现象:卡片有边框有标题,内容区空的。原因:CSP 阻止网络请求,fetch() 和外链 CSS 全被拦,失败记录很轻。解决:数据直接写进 fragment,图片走 data-viz-src 让服务端取。
坑二 · 给新卡片传了 path
现象:以为能指定落盘位置,文件还在 ~/.dsh/visualize/sessions/ 底下。原因:path 是定位符,只服务 update。解决:新卡片只用 fragment、title、mode。
坑三 · 图片位置只剩一个占位框
现象:结构正常,该有图的地方是带 alt 的方框。原因:单张超 5 MB、单卡超 12 MB、超 16 张任一命中就占位;DSH 低于 0.1.7 一律占位。解决:压图、减图、拆卡,先升级。
坑四 · 过了几天,选择自己没了
现象:昨天勾的今天回到默认值,卡片没重画过。原因:每卡 16 KB、合计 256 KB 是硬上限,超出时最久未改的先清,没有提示。解决:别把大段文本塞进 dshViz.state。
总结
七层没有一层是装饰:参数层限定模型能表达什么,落盘层让卡片脱离项目目录,iframe 与 CSP 把模型写的代码关进碰不到宿主的盒子,update 把修改成本压到一处,状态层是刷新后还能接着用的前提。更多插件见 DeepSeek Harness Hub 插件清单。本站给它的验证等级是 L5 运行时冒烟(真实安装成功),安全扫描结论是含敏感能力、尚无人工评估 —— 能跑通不等于被审过。
适合与不适合
适合:调参数看结果的模拟器;几组指标并排比较的对比面板;UI mockup 成稿;带图注的论文风格结果图。
不适合:只在 TUI 或 headless 里工作的人,那两种客户端只显示普通工具结果;需要卡片自己请求接口的场景,CSP 不允许;要求通过人工安全评估才能进生产的环境。
标签:dsh-visualize、DeepSeek Harness、可视化、iframe 沙箱
本文由 DeepSeek Harness Hub 自动整理,数据来源于插件详情页。