DSH 正式 bundle 插件:按会话隔离跟踪各会话 AI 通过 edit/write 工具对工作区的文件改动,提供文件级聚合 diff(基线 vs 当前,LCS 行级)与一键确认/撤回。
- 后处理捕获:监听
tools/result(edit/write),读返回值before作基线,零拦截零阻塞 - 多会话隔离(v21 模型):每条记录带改动所属会话(子 agent 归父会话)+ 工作区 cwd;
sessionId随 RPC 上报即自动登记(自愈,无"首绑定生效"竞态);各窗口面板只显示自己会话的改动 - 聚合 diff:同一文件改 N 次只呈现最终增删;长上下文自动折叠、↑↓ 变更块跳转、空白差异可见化(␍/·/→/空行占位 + 「仅空白差异」徽标)
- 居中模态弹窗:点文件行弹出(shell.overlay 框架层,脱出会话列),点遮罩空白 / Esc / × 关闭
- 确认/回退:单文件与全局两档;回退按记录自身 cwd 直接写盘(宿主身份 node fs,无沙箱限制),新建文件删除
- 插件独立配置(Settings 服务 +
settings.section设置面板):忽略换行符变化(CRLF / LF 视为相同)——开启后比较前剥除\r,仅换行符差异的文件不再显示为改动,内容差异照常呈现;即时生效、持久化(dsh-settings-file) - 诊断条:rev/results/captured/skipped/foreign/sess/root/errors/lfIgnored/unchanged 一目了然
⚠️ 不要用dev_install_package,也不要把本包加进dsh.profile.bundles: bundles 列表要求每个包在 package.json 声明dsh.bundle(组合包 patch 层),本包是注入式模组 (只有dsh.client),误加会让dsh web启动直接崩溃:profile bundle "@dsh-external/diff-viewer" declares no dsh.bundle in its package.json(实测踩坑,2026-08)
已通过 dev_inject_plugin 注入,注入器清单持久化在 ~/.dsh/super-injector/registry.json:
- 运行时:junction
~/.dsh/profiles/web/node_modules/@dsh-external/diff-viewer→ 本目录 + loader entry - 重启后由注入器(bundles 里的
@dsh-external/dsh-super-injector)按 registry 自动恢复 - profile
package.json的dependencies保留"@dsh-external/diff-viewer": "link:<本目录>"(junction 可解析);dsh.profile.bundles不含本包
- 拷贝目录:把整个
diff-viewer/(含lib/预构建产物)拷到目标机器任意位置 - 前提:目标机器装有 DSH 与 dsh-super-injector(
dev_*工具可用) - 安装(对目标机器的 AI 说,或直接调工具):
注入器 registry 持久化,重启自动恢复
dev_inject_plugin F:\DeepSeekHarnessPlugins\diff-viewer - 改代码后重新构建(可选):目标机器需能访问一个 DSH 源码 checkout(build.ps1 默认探测
D:\DeepSeekHarness\deepseek-harness-master,可用DSH_CHECKOUT环境变量覆盖):构建产物是平台无关 JS,不依赖本机任何环境$env:DSH_CHECKOUT = 'D:\path\to\deepseek-harness-master' pwsh -File scripts\build.ps1
只改
lib/后热重载:dev_reload_package diff-viewer(不用重装) 卸载:dev_uninject_plugin diff-viewer(卸载即净)
# 环境无 bash 时用 PowerShell 版构建(本仓库自带 scripts/build.ps1)
pwsh -File scripts\build.ps1 # tsc 编译 host + tsdown 打包 client → lib/
# 安装(注入器持久化,重启自动恢复;本插件的正确方式)
dev_inject_plugin F:\DeepSeekHarnessPlugins\diff-viewer
# ⚠️ 不要用 dev_install_package(会写 bundles,无 dsh.bundle 声明 → 启动崩溃)产物:lib/index.js(host:tools/result 监听 + /diff-viewer/api JSON 路由)、lib/client.js(client:dock 面板 + overlay 弹窗,ModuleLoader 模块)。
| method | payload | 说明 |
|---|---|---|
state |
{sessionId} |
该会话的记录快照(调用即登记会话) |
confirm |
{sessionId} |
接受该会话全部改动,清空记录 |
revert |
{sessionId} |
按基线回退该会话全部改动(新建文件删除) |
confirm-file |
{rel, sessionId} |
接受单文件 |
revert-file |
{rel, sessionId} |
回退单文件 |
poll |
{sessionId} |
rev + total(备用) |
settings.get |
{} |
{ ignoreLineEndings, persisted } |
settings.set |
{ignoreLineEndings} |
更新开关(Settings 服务持久化),返回新值 |
打开 DSH 设置 → Diff Viewer,勾选「忽略换行符变化(CRLF / LF 视为相同)」即时生效。
数据经 ctx.settings(dsh-settings-file)持久化;host 无 Settings 服务时退化为内存开关。
- shell/pwsh 直写、宿主工具(dev_*)写入检测不到
-
1MB 文件只标记不记基线(不可撤回)
- 同一绝对路径被多个会话修改时,首次触碰的会话锁定基线