Kr-ATG/dsh-chat-flow
DSH 对话流增强插件(零 DSH 源码改动,纯插件注入)。回合呈现:思考 chip(实时走秒 + 实时文字滚动)· 工具调用聚合 chip · 对话流卡片(步骤卡/总结卡)· 共享活动抽屉。正文增强:proto-tabs 可交互卡片 · diagram 流程图围栏 · 本地 HTML 内嵌预览(识别正文里的 .html 路径,host 读文件 + 同目录资源,iframe 沙箱隔离,高度自适应,1:1/等比缩放,浏览器打开)。界面与工具:会话头部对话/轨迹标签上移 · 对话截图(常驻无头浏览器渲染 markdown/shiki/mermaid 真图,可内嵌本地 HTML)· download 下载工具(实时进度条/速度/ETA)。
Project Overview项目介绍
This is an independent chat flow enhancement plugin for DeepSeek Harness, working without modifying DSH source code. It offers 9 features including turn rendering, content enhancement, UI adjustment, screenshot and download tools. Use it for better organized chat viewing and extended workflow tooling. It conflicts with dsh-webui's toolSummary module if both are enabled.
这是DeepSeek Harness的独立对话流增强插件,无需修改DSH源码即可注入使用。提供回合呈现、正文增强、界面优化、截图下载等9项能力,适用于整理对话、调用工具、导出会话。注意若同时安装dsh-webui,需关闭其toolSummary模块避免冲突。
请帮我了解并安装插件:【dsh-chat-flow】【https://github.com/Kr-ATG/dsh-chat-flow】
Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。
Or use CLI install (for developers)或使用命令行安装(适合开发者)
CLI Install命令行安装
dsh plugin --profile web add github:Kr-ATG/dsh-chat-flow
把 Kr-ATG/dsh-chat-flow 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
dsh-chat-flow — DSH 对话流增强
把 dsh-webui 全家桶里的对话体验拆成独立插件(webui 卸载后补回),零 DSH 源码改动、 纯插件注入。当前 9 项能力 + 4 组动效,分四组:
- 回合呈现:思考行 / 工具行(官方 turn-process 同款,实时走秒 + 分步跟随滚动)· 对话流卡片 (步骤卡 / 总结卡,回合收口才出现)· 共享活动抽屉(思考语义分组 + 工具调用树)
- 动效(移植自
aa2246740/dsh-better-display,MIT):思考两行步进跟随(840ms 停顿 / 500ms 走两行,上翻即停)· 流式新文字淡入(只动新挂载块,旧文不动)· 忙碌标签 2s 微光 · 工具行 / 气泡展开收起过渡(260ms / 200ms,播完再卸载) - 正文增强:proto-tabs 可交互卡片(pill / expand / glow)· diagram 流程图围栏 (JSON → SVG)
- 界面与工具:会话头部「对话 / 轨迹」标签上移到右上角 · 对话截图(无头浏览器出图, 可内嵌本地 HTML)· download 下载工具(wire 工具 + 实时进度条)
产物 5.05 MB(host 3.45 MB + 浏览器半身 258 KB + mermaid 资源 968 KB),浏览器侧只加载 258 KB。
| 能力 | 说明 |
|---|---|
| 思考行 | 无工具调用的回合只剩这一行官方 turn-process 同款(已思考 › + 底部发丝线);有工具调用时并入工具行(抽屉里仍有思考分区;流式思考中工具行下方同步挂实时预览卡,收口自动消失)。思考中实时走秒(思考中 · 12.3s,2s 微光)+ 实时预览卡片(标题「思考 · 步骤 N」+ 有界视口 224px + 上下缘渐隐;分步跟随 840ms 停顿 / 500ms 走两行,上翻/选中即停,滚回底部自动恢复),点击 chip 行打开共享活动弹窗看全文 |
| 工具调用聚合 | 直接接管官方 turn-process control 位:每回合只留一行官方同款(N 次工具调用 › + 底部发丝线,文案走官方 chat locale 键,中英文自动切换),点正文进活动弹窗、点尾部 chevron 走官方内联折叠——再无双行;有思考的回合行尾缀思考数(N 次工具调用 · 思考 M,与弹窗页签同口径)。弹窗内容:工具调用总结卡(次数/进行中/失败/按工具分布/涉及文件点击跳转)+ 调用卡片(图标 + 变体标题 + 一行摘要 + 阶段徽标,展开后是台账与结果/输入/原始数据页签,命令/读写/差异/搜索/网页结果用原生展示块,子调用沿左导轨递归)。无 control 的回合(非紧凑模式/流式中)回退到成员槽位自有行 |
| 对话流卡片 | 总结卡头部 chip 含 Git 操作计数(本轮 git 调用次数,悬停看动词摘要);头部单色分层(标签弱化 + 数值加强 + 状态圆点,仅对勾留一笔语义绿,hover 上浮);全卡片去底色(1px 超细发丝边条 + 轻阴影,深浅主题各配色) |
| 共享活动抽屉 | 浏览器侧居中对话框(dim 遮罩 + 面板,z-index 9990/9991,截图面板同款框架;打开底部上滑进入、关闭淡出,播完再卸载),头部分区页签(思考 N / 工具 N,两边都有内容时可切,行点击只决定初始分区),思考按语义分类成组(实施编写/原因排查/验证确认/规划方案/决策权衡/总结汇报/探索分析),工具调用按树展开(行展开/收起 260ms 高度补间);Esc/点遮罩关闭 |
| 可交互卡片 | 正文里的 proto-tabs 围栏渲染成可点击的 Tab 卡片(信息分层 pill / 可展开卡片 / AI 流光三种形态,缺省 pill);解析失败自动回退原文,绝不崩卡 |
| 对话截图 | assistant 消息操作栏相机按钮 → 截图面板(范围本条回复/这一轮/整段会话 × 版式电脑/手机 × 画质 1080P/2K/4K × 画幅 × 五套主题(浅/深/玻璃/玻璃深/阅读版);标题/徽章可编辑;预览后保存/复制/下载/打开目录;「元素删除」编辑模式点击页面删元素再重新生成)。正文里提到的本地 HTML 会自动内嵌进截图(走 file:// iframe,同目录样式图片照常加载,只嵌页面本身,最多 3 张);host 端常驻无头浏览器渲染卡片(markdown-it + shiki + mermaid 真图),保存目录 ~/.dsh/storages/dsh-chat-flow-screenshot |
| 会话头部视图标签 | 官方把「对话 / 轨迹」两个视图标签独占标题下方一整行(header 76px);本插件把 header 改成单行 flex,标签钉到右上角与标题同行(header 收回 45px,省下的 31px 还给正文),下划线贴字、hover 从中心展开、选中常驻蓝条。纯 CSS 注入,选择器只用 header / role=tablist / CSS Module 的 _titleRow、_tab 后缀,不依赖构建 hash 前缀;单视图(无 tablist)时 :has 不匹配,零影响。桌面壳(Electron 无边框窗口)右上角自绘 最小化/最大化·还原/关闭:与壳走 dsh:shell-hello → dsh:shell-chrome 能力握手,收到应答才给 <html> 挂 dsh-in-shell(旧壳不应答 = 行为不变,不留空档),header 右 padding 28px→128px,右侧控制簇(工作区按钮/更多/侧栏展开/对话·轨迹)整体左移 100px 留位;同时监听 <body data-ds-dark-theme> 把主题以 dsh:theme postMessage 给壳,壳按钮颜色随界面深浅同步。浏览器直开两者零影响 |
| download 下载工具 | host 半身注册 wire 工具 download(url / dest / overwrite,Node 流式写盘,优先于用 pwsh 跑 curl)+ 进度路由 GET /api/chat-flow/download/progress?callId=;client 半身 keyed tool.call.toolview(key=download)渲染实时进度条(已收/总量、速度、ETA,确定填充+辉光游标/不定长游标滑动两态),完成态读结果 meta 显示落盘路径 + 大小 + 用时 + 「打开」按钮。进度按 callId 严格对齐(run_code 子调用 <parent>:code:<n> 两端同源),对话流 chip 与抽屉行同步显示百分比;缺省保存 ~/.dsh/storages/dsh-chat-flow-downloads/ |
正文链路保持官方:text 块用官方 MarkdownText(ui-primitives)、图片走官方
renderMessageImages 槽——不引入 markstream / shiki / katex(截图渲染是 host
端独立管线,不受影响),流式渲染与内置 UI 完全一致,性能零负担(不做常驻
轮询,统计全部来自已有会话投影)。截图引擎空闲 5 分钟自动回收,卸载即关。
流程图卡片(diagram,flowchart)
diagram 围栏放 JSON(坐标 /4 网格,节点 ≤9、边 ≤12,非法结构自动回退原文):
{"type": "flowchart", "title": "标题", "desc": "一句话", "nodes": [{"id": "a", "shape": "oval", "x": 280, "y": 24, "w": 160, "h": 48, "name": "开始", "sub": "start"}], "edges": [{"from": "a", "to": "b", "label": "是", "accent": false, "pts": [[360,72],[360,120]]}]}
shape 三选一 oval / rect / diamond,pts 为完整折线点(含起终点,圆角自动倒)。size 缺省 full,紧凑版设 "size": "compact"(去副标签和图例,矮四成)。卡片右上角另有“紧 / 标 / 大”切换,看图的人可随时改比例(放大横向滚动)。视口自动贴合内容宽度,窄图不留两侧空白。
可交互卡片(proto-tabs)
总结时想放可点卡片,正文里加一个围栏(JSON,tabs 最多 4 个,minis 每 Tab 最多 4 条):
{"title": "胶囊组件重构设计提案", "tabs": [{"label": "方案 A:信息分层", "variant": "pill", "heading": "高可读性重构", "pill": {"tag": "Embedding 向量嵌入", "desc": "把文字映射为多数值向量", "detail": "点击展开的详情"}, "minis": [{"t": "1. 视觉锚点", "d": "专有名词打 Tag"}]}]}
variant 可选 pill / expand / glow,缺省 pill(方案A)。未闭合围栏(流式中)与非法 JSON 都按原文显示。
host 半身改动要重启 DSH 服务才生效(托盘「重启服务与程序」);client 半身刷新页面即可。
一句话安装(DSH)
dsh plugin --profile web add github:Kr-ATG/dsh-chat-flow
重启 DeepSeek Harness 即可。本包在 package.json 声明了 dsh.bundle.patch,
dsh plugin add 完成后自动加入 profile 的 bundles 层,无需手动改 patch。
本地开发安装(junction,与 dsh-done-pill 同款):
New-Item -ItemType Junction -Path "$env:USERPROFILE\.dsh\profiles\web\node_modules\dsh-chat-flow" -Target D:\AI\Dsh\dsh-chat-flow
并在 ~/.dsh/profiles/web/cordis.patch.yml 追加(同 id 条目按 last-write-wins 合并):
- insert:
- id: dsh-chat-flow
name: dsh-chat-flow
卸载
dsh plugin --profile web remove dsh-chat-flow
本地 junction 安装:删除 junction 与 profile patch 里的 insert 条目,重启 DSH。
与 dsh-webui 共存
两者都替换 conversation.chat.node 的 tool-call / assistant-step 槽位
(priority -100)。webui 已安装时请关闭其 toolSummary 模块(保留官方正文),
或不要同时安装本插件,否则同 key 同 priority 的第二个注册会抛错。
活动抽屉 window 总线键
__dshActivityDrawerStore__与 webui 相同:若 webui 的 toolSummary 同时开启,两者共享同一抽屉(last-write-wins)。
对话截图不受上述冲突影响:本插件注册
conversation.chat.assistant-actions的 id 为chat-flow-screenshot(webui 为webui-screenshot),路由前缀 与保存目录也都独立(/api/chat-flow/screenshot与storages/dsh-chat-flow-screenshot)——共存时只是在每条消息上多一个 相机按钮。
产物体积
发布内容约 5.0 MB:lib/index.js 3.45 MB(host 半身)+ lib/client.js 258 KB(浏览器半身,另带 457 KB 的 map 给 DevTools 断点用)+ assets/ 968 KB(mermaid 引擎预压缩)+ 构建脚本零头。两处刻意省下来的:
- host 半身不出 source map:Node 只有带
--enable-source-maps才读它,DSH 服务没开,13.6 MB 的 map 纯属占地方(也占 git 历史)。build.mjs里 host 是sourcemap: false,client 保留。 - shiki 走 fine-grained:
shiki/core+shiki/engine/javascript+ 显式 import 的 34 个 grammar 与 2 个主题。之前从shiki主入口createHighlighter,esbuild 会把全量 ~220 种语法(约 10 MB)内联进来,而其中未注册的那些本来也用不到(codeToHtml外面套着 try/catch,未注册语言回落纯文本)。用纯 JS 正则引擎而不是 oniguruma wasm,是为了不引 wasm 文件路径依赖 —— 产物仍是单文件自包含,装到 profile 的 node_modules 里也不会找不到 wasm。代价是首次高亮慢一些(三个代码块含引擎初始化约 550ms,截图整体 1.4s 内),加语言要在src/shot/markdown.ts的 import 列表里补一行。
构建(Windows)
node build.mjs # esbuild 双 bundle:lib/index.js(host) + lib/client.js(browser)
- host 半身运行时导入仅 node: 内置(markdown-it / shiki / CDP 客户端全部内联,
产物自包含),构建末尾有
assertHostExternals()守卫拦截不可解析的 specifier;mermaid 引擎(assets/vendor/mermaid.min.js.gz)随包分发, 运行时由截图引擎按需解压进临时页面; - client 半身 external react 家族 +
@deepseek-ai/*(DSH client 模块表 运行时提供实例),CJS 工厂包window.__ModuleLoader__.load契约; - esbuild 解析顺序:本地 node_modules → DSH checkout pnpm store(可设
DSH_CHECKOUT环境变量)。
类型检查(借用 DSH checkout 的 typescript,paths 已指向同一 checkout):
node <DSH>/node_modules/.pnpm/typescript@*/node_modules/typescript/bin/tsc -p tsconfig.json --noEmit
冒烟测试
node scripts/smoke-host.mjs # 裸 node 加载 lib/index.js,校验插件形状
node scripts/smoke-client.mjs # node:vm 假 window.__ModuleLoader__ + DOM,
# 校验 apply 挂抽屉/样式/两个槽位注册
结构
src/
├── host.ts — host 半身:spill 图片读取 + 截图路由接入
├── shims.d.ts — markdown-it 插件的无官方类型声明
├── browser/ — 零依赖 CDP 客户端 + 系统 Chrome/Edge 启动
├── shared/
│ ├── html-paths.ts — 本地 HTML 路径抽取(截图内嵌用)
│ └── sanitize-html.ts — 模型原始 HTML 净化(截图 markdown 管线用)
├── shot/ — 截图 host 半身(自 webui/screenshot 移植)
│ ├── index.ts — /api/chat-flow/screenshot 路由(render/save/reveal/image/diagnose)
│ ├── card.ts — 卡片 HTML 组装(页头/标题/正文/页脚/鲸鱼署名)
│ ├── markdown.ts — markdown-it + shiki + mermaid 围栏识别
│ ├── theme.ts — 五套主题 CSS 编译(浅/深/玻璃/玻璃深/阅读版)
│ ├── presets.ts — 设备×画质档位(host/client 共用纯数据)
│ ├── renderer.ts — 常驻无头浏览器 + 串行渲染队列 + 长图分段拼接
│ └── stitch.ts — PNG 拼接(零依赖手写 filter/CRC32)
└── client/
├── index.ts — client 入口:样式 + 抽屉 + 三座注册
├── styles.ts — 思考 chip + 对话流卡片样式(dtt__ 命名空间)
├── flow-card.tsx — 步骤卡 / 总结卡(ReplyCardMeta 统计)
├── modal-animation.ts — 弹窗开合动画(截图面板共用)
├── thinking/
│ └── ThinkingStepNodeView.tsx — assistant-step 替换:回合聚合思考 chip +
│ 卡片门控(回合结束才出卡)+ 官方正文渲染
├── shot/ — 截图 client 半身(自 webui/screenshot 移植)
│ ├── index.tsx — assistant-actions 相机按钮(useChat 快照 ref)
│ ├── Panel.tsx — 截图面板(范围/版式/画质/画幅/主题 + 元素删除)
│ ├── collect.ts — ChatSnapshot 消息抽取(0.1.2 扁平节点形状)
│ ├── api.ts — /render /save /reveal API 客户端
│ └── styles.ts — 面板样式(tsh__ 命名空间)
└── tool-summary/ — 工具聚合(自 webui/dsh-tool-summary 移植)
├── ToolGroupNodeView.tsx — 每回合一枚工具 chip + 抽屉入口
├── activity-drawer.tsx — 共享活动抽屉(window 总线 + 居中弹窗)
├── tool-stats.ts — 统计/耗时/下载解析纯函数(callView 防御式读取)
├── activity-kind.ts — 调用分类徽标(git push/构建/测试…)
├── reasoning-classify.ts — 思考语义分类(关键词打分)
├── icons.tsx — kind 徽标 SVG 字形
├── use-now.ts — 走秒时钟
└── styles.ts — 工具聚合样式(dts__ 命名空间)
assets/
└── vendor/
└── mermaid.min.js.gz — mermaid 引擎(截图带图围栏时解压使用)
scripts/
├── smoke-host.mjs
└── smoke-client.mjs
许可
MIT
Awesome-AI-Pedia/Awesome-AI-Pedia
imsai-sh/awesome-deepseek-harness-plugins
2BingLing/dsh-market
akira399/dsh-novel-writer
kenz1117/dsh-ui-usage-billing
imsai-sh/dsh-1024store
pazz11/Jnpz