模型还在写参数时就能看到 diff 逐行生长
29.6/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/phoenixyun/dsh-plugin-live-diff.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 34 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 5 处,展示前 5 条)
- 写入本地文件lib/index.js:94
mkdirSync(dirname(file), { recursive: true }); - 删除本地文件lib/index.js:97
unlinkSync(file); - 写入本地文件lib/index.js:107
appendFileSync(file, `${line}\n`, "utf8"); - 读取本地文件lib/index.js:147
const stats = statSync(file); - 发起网络请求lib/client.js:546
const response = await fetch(DIAG_ENDPOINT, {
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- diff逐行生长
DSH 文件编辑的实时流式 diff:模型还在输出编辑参数时,diff 就已经在增长了。
README
由 DeepSeek 最新模型翻译生成dsh-plugin-live-diff
给 DSH 的文件编辑加上实时流式 diff —— diff 会随着模型吐参数当场长出来,而不是等工具调用结束才整块出现。
English →
┌ Live Diffs ─────────────────────── 1 in flight ─┐
│ solar/viewport.py python │
│ 403 + def zoom_by(self, steps, anchor_x=None): │
│ 404 + world_x, world_y = self.to_world(…) │ │ 405 + self.zoom = clamp_zoom(…) │ │ 406 + self.offset_x = anchor_x - … ▌ │ └─────────────────────────────────────────────────┘
演示视频
26 秒 B 站演示 —— 「deepseek v4.1 flash 太强大了 50元手搓文件变更实时预览」\
Live Diffs for DSH —— 边写边看的编辑过程
问题在哪
DSH 其实已经有 diff 卡片,也已经在累积流式数据(宿主里那句 argsRaw: base.argsRaw + chunk.argumentsDelta 就是为此存在的)。
展开完整文档(README 剩余 1 节)
dsh-plugin-live-diff
给 DSH 的文件编辑加上实时流式 diff —— diff 会随着模型吐参数当场长出来,而不是等工具调用结束才整块出现。
English →
┌ Live Diffs ─────────────────────── 1 in flight ─┐
│ solar/viewport.py python │
│ 403 + def zoom_by(self, steps, anchor_x=None): │
│ 404 + world_x, world_y = self.to_world(…) │ │ 405 + self.zoom = clamp_zoom(…) │ │ 406 + self.offset_x = anchor_x - … ▌ │ └─────────────────────────────────────────────────┘
演示视频
26 秒 B 站演示 —— 「deepseek v4.1 flash 太强大了 50元手搓文件变更实时预览」\
Live Diffs for DSH —— 边写边看的编辑过程
问题在哪
DSH 其实已经有 diff 卡片,也已经在累积流式数据(宿主里那句 argsRaw: base.argsRaw + chunk.argumentsDelta 就是为此存在的)。它缺的不是数据,而是一个能容忍半到达参数串的读取器:
// dsh-client-ui-tool
value = JSON.parse(call.argsRaw); // 文档被截断就抛错
if (typeof oldText !== "string" || typeof newText !== "string") return null;
调用进行中时 argsRaw 是一个被截断的 JSON 文档,解析必然失败,于是卡片一直是空的,要等最后一个 token 落地。这个插件提供的就是那个容错读取器,以及一个把结果放上去的界面。
功能
- 悬浮面板(Live Diffs):字符到达时就地更新 diff。左边缘可拖拽调宽,宽度会被记住,刷新后还在。
- 聊天记录里的 diff 卡片:针对 edit / write,通过 DSH 自己的 DiffBlock 图元渲染,所以和宿主自己的 diff 卡片天然一致。
- 容错读取器:值字符串还没闭合的字段,返回"可用但不完整",而不是 null。
- 部分语法高亮:按语言分别配置(Python、JS/TS、JSON、YAML、shell、Markdown)。
- 流式期间面板自动跟随最新一行;你用鼠标滚上去就会松开跟随,滚回底部自动恢复。
- 编辑结束后不关闭面板:entries 一空就清屏会把用户正在看的东西抹掉,所以会保留最后一次结果。
- 面板是增量更新 DOM 的,不是每次轮询整块重建 —— 所以行的淡入动画只播一次,而不是每 80ms 重播一次(那看起来就是"一直在闪")。
只接管渲染。 不写你的文件,也不修改任何其他包。
环境要求
在 DSH 0.1.5-rc.1 / Windows 上开发并验证(cordis 4.0.2、 dsh-api-session-controller 0.1.5-rc.2)。
这个插件是通过 DSH 的内部客户端接口接进去的,不是一套已发布的扩展 API。
下面这些都没有版本承诺:
| 依赖的东西 | 用途 |
| ctx.sessions 客户端服务 | 读取会话事件窗口 —— 唯一携带流式 tool-call-delta chunk 的数据源 |
| ctx.slots / ctx.sidebarRightTabs | 注册聊天记录卡片与侧边栏标签类型 |
| @deepseek-ai/dsh-client-ui-primitives(DiffBlock) | 聊天记录里的 diff 卡片 |
| ctx.webServer + ctx.clientModules | 宿主侧 /live-diff-diag 诊断路由 |
| 针对 edit / write 的 keyed tool.call.toolview | 替换 DSH 自带的 FileMutationRow |
最后一行是最脆的一环:keyed 注册会替换官方那一行,也就是说这个插件是在故意覆盖 DSH 自带组件。如果某次 DSH 升级改了工具 key 名、改了 toolview 契约,或者重构了会话事件窗口,它就会失效——而且大概率表现为面板空白,而不是报错。
如果你用的不是同一个 DSH 版本,可以先装上试试,然后看诊断输出(见下):面板会如实报告 "它看到了什么、没看到什么",而不是静默失败。
安装
两部分,都在 DSH 自己的文件之外。
第一步:让包能被解析到。 在活动 profile 的 node_modules 下建一个联结/符号链接。
必须这样,不能用 file: 说明符 —— Loader 解析不了那种写法。
:: Windows
mklink /J "%DSH_HOME%\profiles\node_modules\dsh-plugin-live-diff" "C:\path\to\dsh-plugin-live-diff"
POSIX
ln -s /path/to/dsh-plugin-live-diff "$DSH_HOME/profiles/node_modules/dsh-plugin-live-diff"
第二步:在 profile 的用户补丁层 profiles/web/cordis.patch.yml 里加一行:
- insert:
- id: live-diff
name: dsh-plugin-live-diff
第三步:重启 dsh web。 运行中的进程不会发现新装的包,这一行必须在启动时被看到。
之后对插件源码的修改会被热加载(patchReload: live),但改客户端 bundle 仍然要重启 + 硬刷新(Ctrl+Shift+R)—— 普通刷新曾经返回过旧 bundle。
验证
node test/parser.test.mjs # 容错读取器,覆盖真实调用的每个截断点
node test/overlay.test.mjs # 增量 DOM 更新、拖拽调宽
node test/apply.test.mjs # 注册,以及 CSS/布局守卫
node test/highlight.test.mjs # 语言识别与分词
node test/host.test.mjs # 宿主侧诊断路由
五个都应当以 0 退出。
然后让模型编辑一个文件,看面板。如果面板一直是空的,它自己的诊断页脚和宿主日志会告诉你原因(见下)。
诊断
作者(也就是 AI)打不开你的浏览器,所以面板会自己上报。每次状态变化时它把一行读数 POST 到 /live-diff-diag,宿主侧追加写进日志文件:
- 默认位置:<系统临时目录>/dsh-plugin-live-diff/diag.log
- 覆盖方式:环境变量 DSH_LIVE_DIFF_LOG
每行包含事件窗口计数和一段压缩后的事件序列:
{"surface":"overlay","entryCount":1,"deltaCount":269,"accumulating":1,
"sequence":"b0) t0)x269","toolNames":["write"],"reason":"deltas present"}
sequence 把"同一流索引上连续同类型的 chunk"压成一段,事件到达顺序就是靠它确认的: block-start 总是在该索引的 deltas 之前。
面板不会改写 document.title。 以前会;但标题只在标签页未激活时才可见,而那恰好是没人在看 live diff 的时刻。
设计笔记
那些不显然的决定 —— 为什么面板是原生 DOM 而不是 React、为什么放弃了侧边栏方案、为什么没有直接移植 Cline 的组件、实测的传输粒度、以及两次踩中的布局陷阱 —— 都在 docs/DESIGN.md(英文)。
致谢
行为(不是代码)参考了 Cline 的流式 diff:数据到多少就显示多少而不是直接放弃、"还在流式"从文档没闭合推断、视图钉在最新一行。细节见设计笔记。
Cline 是 Apache-2.0,本仓库不含任何 Cline 代码。
许可
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
phoenixyun/dsh-plugin-live-diff
模型还在写参数时就能看到 diff 逐行生长
相关插件 · 其他
模型破甲清洗YuJunZhiXue/dsh-purge
⚔️ DeepSeek Harness 网络安全红队工具dsh-purge
★ 16,148已汉化DeepSeek 客户端
73
女娲蒸馏alchaincyf/nuwa-skill
输入名人名字,提炼其思维模型与决策方式供你调用
★ 37,308已汉化DSH
72
逆向分析桥接Fanqi89/dsh-rea
REA(Reverse Engineer Anything)MCP 桥接,用来把 REA 逆向工具接入 DSH 插件
★ 51已汉化DSH
72
语音女友beiyege-01/dsh-voice-ai-girlfriend
语音 AI 女友Voice AI girlfriend for DeepSeek Harness:Whisper…
★ 888已汉化DSH
71.6
红队越狱测试套件Minglink/dsh-infinite-gen-5
DeepSeek v4.1 flash 逆向工具无限五代 求 Star 收藏 ⭐欢迎大家提交项目的改进
★ 3,759已汉化DSH
71.4
协同办公空间dream-num/univer-workspace
一个让人类与 AI Agent 共同创作、协作和审阅的开源 Office 工作空间。
★ 2,266已汉化DSH
70.7
这是你的仓库?认领条目