packages/dsh-task-board
zhu1090093659/dsh-web侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
让 DeepSeek Harness Web GUI 把 agent 输出的 HTML 渲染成真实界面,支持视觉卡片、KaTeX 公式、Mermaid 图表与内置开源字体,并向 agent 注入设计规范。
在 DeepSeek Harness Web GUI 中实现 VCP(Visual-Synesthesia,视觉通感)协议: 消息里的 HTML 从「一坨源码」变成真正渲染的界面,并让 agent 按一套可维护的设计规范输出。
即插即用:任何电脑、任何 agent —— 跑一次一键安装器补丁(node patch/install-all.cjs,渲染能力+可信模式全到位)
浏览器开始渲染 HTML(含 SVG 卡片 / Mermaid 图表 / KaTeX 公式),agent 开始按规范输出(设计原则 / 中文排版 / 字体搭配)。
渲染能力(HTML/SVG/图表/公式)由补丁注入前端 bundle,插件负责开关与协议注入——
详细步骤见下方「安装」章节。
English README · 更新记录
真实会话中的 VCP 卡片渲染效果(宣传图 5 张):
撕裂)与卡片内部空行拆分问题,fixVcpBlank` 补空行/压缩空行,整卡回归单一 htmlFlow(稳定测试 105 断言全绿)。data-vcp-preset(内置 VCPColorEngine 确定性生成整套色板,对比度/色域闭环保证);流式锚定锁 + ref 闭包缓存(流式更稳不抖)。on* 事件属性透传缺口(只放行 onclick 桥接);性能计时器诊断修复;文档引用对齐。prefers-reduced-motion 无障碍、键盘焦点态、魔数收拢。package.json 的 version(当前 0.6.0),随 dsh plugin 升级。patch/ 注入模块的演进代号(当前 v6 · 子版本 v6.38),由 install-v6.cjs 应用到前端 bundle,二者独立演进。前端兼容 0.0.1-rc.5 ~ 0.1.0-rc.7 与 0.1.0-rc.8 / 0.1.1-rc.x 两代压缩形态(vc/hp 与 Xu/jd 自动探测适配)。部件 · 位置 · 作用 一键安装器 · patch/install-all.cjs · 推荐:一条命令 = install-v6.cjs(渲染能力)+ trusted-patch.cjs(可信模式 vc 放行);幂等 + 备份回滚 + node --check 健康检查,锚点不匹配安全中止 万能安装器 · patch/install-v6.cjs · 渲染能力 v6 全量补丁(install-all 的组件①):自动探测 dist bundle,任意历史状态 → v6(幂等 + 备份回滚) 稳定区渲染模块 · patch/v6-inject.js · 注入 dist bundle 的增量渲染引擎:容器感知块级缓存、流式尾巴占位、KaTeX 公式、Mermaid 查看器;onclick="input('...')" 桥接为真实交互;安全过滤 script/iframe/object/embed、on* 事件与 javascript: 协议 vcp-fast 加速引擎 · patch/v6-inject.js · 容器感知块级增量:已闭合块缓存(元素引用跨帧不变 → React 跳过 diff → 动画真循环),只重渲染尾巴;实测缓存命中 1200~6800 倍、增量 12 倍 提速 插件(Host 半侧) · lib/index.js · 渲染/美学双开关状态(落盘持久化)+ 系统提示词分层注入(结构铁律必注入 + 美学工具包可选)+ /fonts 字体服务(内置精选 + 外置大库双源)+ 知识层共享(协议附带本机 DESIGN.md 路径,任何 agent 可读) 插件(浏览器半侧) · lib/client.js · composer 发送按钮旁注入「」按钮(点击弹出设置面板,渲染/美学双开关,主题令牌适配深/浅色)+ 暴露 window.__dshInput(VCP 按钮 → 填框发送) 内置精选字体 · assets/fonts/ · 7 款开源字体(woff2 子集,共约 7.6MB)随插件分发——文楷/文楷细/马善政楷书/思源黑/思源细黑/思源粗黑/GreatVibes 花体,全部 OFL 授权,任何电脑装上即可用,无需任何配置 设计系统文档 · DESIGN.md · 完整规范库:字体清单/色板/中文排版/安全铁律(知识层,agent 可按需读取) 回归测试 · tests/ · 六套断言(stable 47 + security 43 + bundle + smoke + math + mermaid,共 200+ 项):帧序列 / 安全过滤 / bundle 完整性(改引擎后必跑) 性能基准 · patch/vcp-fast-bench.cjs · domino 真实 DOM 解析环境对比新旧路径耗时与提速倍数(自动下载依赖,零安装) 子集化工具 · tools/subset_fonts.py · 维护者用:把新字体裁剪为常用字子集 + woff2 压缩(需 Python + fonttools + brotli)
每份规范只在一处权威声明,其余位置挂指针。改规则前先找到它的权威源:
文档 · 唯一权威职责 · 读者 DESIGN.md · 「怎么不崩、怎么不丑」的硬规则:字体库 / 色板 / 中文排版 / 安全铁律 §4(落笔后唯一确认点) · agent 按需读 EDITORIAL.md · 「编辑感 / 数据可视化语法」:四色系 / 卡片四件套 / 明度契约 / 视觉词汇库 / 动效 / 非图表迁移 · agent 按需读 BREATH.md · 「为什么而画」:三步呼吸法 / 规则三层 / 破规时机 / 动笔前三问 · agent 先读 FRAMING.md · 「封面怎么实现」:SVG 顶栏技术要点 / 骨架 / 风格示例 · agent 按需读 VCP-INTERACTIONS.md · 「交互元素 + 渲染层安全白名单」 · agent 按需读 PROGRESS.md · 会话交接快照(进度 / 血泪教训 / 路线图) · 维护者 CHANGELOG.md · 变更流水(插件版本 + 补丁代号) · 维护者
铁律定位:vcp-root 禁止空行 权威在 DESIGN.md §4;交互 / 安全白名单权威在 VCP-INTERACTIONS.md。新增规则先判断归属,只写进权威源,别处挂指针。
推荐:一键安装器 `patch/install-all.cjs`——一条命令把「渲染能力 + 可信模式」全部装好 (内部依次执行 install-v6.cjs 全量渲染补丁 + trusted-patch.cjs 可信模式 vc 放行; 幂等可重复运行,每一步自动备份 + node --check 健康检查,锚点不匹配安全中止不写坏文件):
# 1. 一键打补丁(HTML 渲染 / SVG 卡片 / Mermaid 图表 / KaTeX 公式 / 可信模式,全部就位)
node "本插件路径\patch\install-all.cjs"
# 2. 安装插件(卸载用 dsh plugin --profile web remove dsh-raw-html)
dsh plugin --profile web add "本插件路径"
# 3. 重启 dsh 服务,然后刷新浏览器页面(缓存较旧时 Ctrl+F5)
# 4. 打开「</>」开关(渲染/美学);需要脚本能力时点右下角「可信模式」徽章agent 安装指引(其他用户让自家 agent 代为安装时,可把以上 4 步原样交给它执行):
① 确认本机有 Node.js(node -v);② 运行一键安装器install-all.cjs(自动探测 dist bundle,
失败时把 `` 作为参数传入);③ 注册插件到 web profile;④ 提醒用户重启 dsh 并强刷。
补丁全部幂等——重复安装、dsh 升级后重跑都不会产生副作用。
探测失败时手动指定 bundle 路径:
node "...\patch\install-all.cjs" "C:\...\dsh-web-frontend\dist\assets\index-*.js"单独执行亦可:install-v6.cjs(渲染能力)/trusted-patch.cjs(可信模式 vc 放行);
历史脚本(v1/v2 时代)patch/install.cjs、patch/patch-frontend.cjs、patch/upgrade-patch.cjs
仍保留在源仓库供参考,日常安装请使用 install-all.cjs。在 v1 渲染补丁基础上新增的「缓存 + 增量」双引擎(window.__vcpFast):
[vcp-fast] HIT/BUILD 日志(每 2 秒节流);基准数字见 patch/vcp-fast-bench.cjs(真实 DOM 解析环境实测:缓存命中约 1200~6800 倍、增量约 12 倍提速)。markdown 的 HTML 块遇到空行(`\n\n`)就结束——如果 `` 内部出现连续两个换行, 卡片会被解析成多个独立节点:开头部分被 DOMParser 自动补全成「只有顶部一条背景」的小卡片, 其余内容全部溢出到背景外面。症状:深蓝背景只包顶部一条横框,下方内容没有背景(2026-08-19 实测确认)。
铁律:
\n\n;margin,不要用空行;\n\n 出现次数必须为 0。此铁律的唯一权威源见 DESIGN.md §4 安全铁律(含根因与完整修正),本节仅作运维速查。
I:\字体。其他电脑可把字体库目录配置到「设置 → 插件 → raw-html → fontsRoot」(或直接修改 lib/index.js 里的默认值)。 没有外置大库也能用:内置 7 款开源字体 + 系统字体兜底。
渲染 HTML 与 美学注入 两个独立开关,持久化在 ~/.dsh/dsh-raw-html-state.json,服务重启后自动恢复;渲染关闭时美学自动强制关闭。 OFF(关)/ 渲染(仅渲染)/ ON(渲染+美学);#vcp-root 视觉容器;关闭时协议撤回 → agent 自动回到普通 Markdown(降级)。
onclick="input('回复内容')" 点击后把内容填入输入框并发送。node --check lib/client.js && node --check lib/index.js 验语法;client 改动刷新即生效;host 改动需重启 dsh 服务。
dsh 升级会覆盖被打补丁的 dist 文件 → 重跑 patch/install-all.cjs 即可(幂等;锚点找不到会中止且不写坏文件;备份在 *.bak-installv6-)。
import 的每一个第三方包必须显式声明在 package.json(dependencies 或 peerDependencies)—— 依赖解析靠运行环境存量 node_modules 碰运气 = 把生命线交给风浪。 每次改动后运行 node tools/check-deps.cjs 核对;目录重构/移动 node_modules/ 打包资源后,务必验证 import('@deepseek-ai/schemastery') 可解析。
DESIGN.md(agent 会在需要时读取)+ 同步协议文本(lib/index.js 的 buildProtocolText)。
tools/subset_fonts.py 的 FONTS 清单 + 跑一次(需 Python + fonttools + brotli),自动输出 woff2 子集到 assets/fonts/。
# 把补丁自动生成的备份改回原名(如 index-*.js.bak-xxx → index-*.js),再移除插件:
dsh plugin --profile web remove dsh-raw-html开启后,模型输出中的 HTML 会被渲染为界面。补丁做了脚本/事件/危险协议过滤 (React 元素渲染天然不执行 script;事件只放开 onclick="input('...')" 受控通道; script/iframe/object/embed 与 javascript: 协议丢弃),但样式与外部图片仍然可达—— 请只对可信模型开启。
先生定调 2026-08-29:本会话为双人私密会话,内容由双方共同产出、双方可信——
公共论坛的存储型 XSS 威胁模型不适用。因此为「正文可执行脚本」提供显式开关。
localStorage['raw-html.trusted']='1' 并刷新);或 DevTools 设置 localStorage.setItem('raw-html.trusted','1');或 window.__DSH_TRUSTED__=true。 徽章图标为内联 SVG 盾锁(先生 2026-08-29 定稿方案 A):关态=盾+锁孔,开态=盾+对勾。
iframe/object/embed 放行;on* 事件属性放行;href/src 白名单放宽(blob: 可用)。 仍拒绝:javascript: 协议。
消息渲染完成后统一执行一次;流式中未闭合的脚本不执行(等完整闭合)。
(lib/client.js)——isTrusted()、window.__vcpTrusted 定义、右下角徽章。 主 bundle 渲染层(v6-inject 的 isTrusted / vc 条件过滤)对 window.__vcpTrusted 一律防御式调用:插件未加载(停用)→ 自动 false → 行为与旧版一致(安全默认)。 因此:安装插件 = 可信模式可用;停用插件 = 徽章消失、放行全部回收。 其他用户安装本插件后同样即插即用(可信模式开关层不依赖手工补丁)。
extractTrustedScripts / 执行 flushTrustedScripts /vc 放行)位于主 bundle 的 v6 渲染模块中,仍由一次性 install-all.cjs 注入—— 即「HTML 渲染能力」本身需要补丁安装;开关与状态层随插件。未跑补丁的用户 装插件只有开关 UI,渲染能力不生效(详见「安装」章节)。
tests/trusted.test.mjs(21 项断言,覆盖默认关闭回归、插件层状态、徽章切换、渲染层防御式调用与联动)。
localStorage.setItem('raw-html.trusted','0')。