DeepSeek Harness 插件:dsh-image-annotate

前言

DeepSeek Harness(DSH)通过插件扩展能力。在调试代码、阅读文档时,常见场景是:需要把侧栏里的一段代码、一张图表或一段 PDF 内容发给 AI,并附带标注。传统做法是复制文字、截图、再手动拼凑坐标,容易遗漏或对不准。

DSH 的「请求修改」流程(marquee request-changes)允许在右侧栏里框选内容、逐块写注释,一次性打包成一条消息发给 Agent。dsh-image-annotate 就是这套流程的插件实现:框选、注释、截图坐标、冻结帧,全部在插件内部完成,Agent 收到消息后即可根据坐标裁出真实像素。

功能概览

dsh-image-annotate 为 DSH 增加一个「右侧栏框选标注」流程:

  1. 点击侧栏头部的「⌗ 请求修改」或右下角悬浮球,进入框选模式。
  2. 遮罩只覆盖右侧栏,不影响聊天区点击。
  3. 拖出一个矩形,框旁边弹出注释框(✓ 保存 / × 丢弃)。
  4. 可继续框选第 2、3…块,每块都有独立注释。
  5. 点底部「确认修改并发送」,所有框一次性作为一条消息发出。

消息内容包含:

  • 当前打开的文件路径
  • 窗口几何(innerW×innerH、dpr、screenX/Y、outerW×outerH、chromeH)
  • 侧栏矩形与滚动量
  • 每个框的视口坐标、换算后的桌面截图坐标、注释、框内文字
  • 若框内有 <img>,还包含原图尺寸与裁剪矩形

Agent 可以先对桌面整屏截图,再按插件给出的坐标裁出用户看到的真实像素。

安装

插件发布在 npm,也可直接从 GitHub 仓库安装。

Web profile(推荐)

dsh plugin --profile web add dsh-image-annotate

从 GitHub 仓库安装

git clone git@github.com:ImpartialLucas/dsh-image-annotate.git
cd dsh-image-annotate
npm pack
dsh plugin --profile web add "file:<绝对路径>/dsh-image-annotate-0.7.1.tgz"

Desktop profile

desktop profile 由 Electron 独占,dsh plugin --profile desktop 会被 CLI 拒绝。建议通过 DSH 插件市场 UI 安装,或使用官方通道 runCli({ manageDesktopProfile: true })。

使用流程

  1. 打开一个文件(代码、文档等),确保侧栏可见。
  2. 点击侧栏头部的「⌗ 请求修改」或右下角悬浮球,进入框选模式。
  3. 在右侧栏区域拖出矩形,框旁边弹出注释框。
  4. 输入或修改注释,点击 ✓ 保存,× 丢弃。
  5. 重复步骤 3–4,框选更多区域。
  6. 点底部「确认修改并发送」,所有框作为一条消息发出。

Agent 收到消息后,会收到窗口几何、侧栏矩形、滚动量、截图坐标(已乘 DPR)以及冻结帧(如可用)。根据这些信息,Agent 可以在宿主侧完成 DPI-aware 截屏,再按坐标裁剪出与用户所见一致的图像。

技术细节

消息内容

消息中的截图坐标已经乘过 DPR,是给 DPI-aware 截屏用的。Agent 应该在发送后尽快执行截屏,因为用户可能在之后切换文件或关闭侧栏,导致布局变化。

冻结帧(freeze-frame)

v0.7.0+ 引入宿主侧截屏:插件在点「请求修改」的瞬间(遮罩绘制之前)向宿主发起一个 POST 请求,宿主用 DPI-aware PowerShell 截取整屏并保存为 PNG。消息中优先包含这张图(路径、尺寸、时间戳),若宿主路由不可用,则降级为「请 Agent 在收到消息后立刻 DPI-aware 截屏」。

坐标系统

框的坐标存储为 {cx, cy, w, h},其中 cx 相对侧栏左边缘,cy 相对滚动内容原点。发送时,会根据当前的侧栏矩形和滚动量重新解析一次,确保裁剪坐标对应发送那一刻的真实位置。

已知限制

  • 无法在浏览器内把 DOM 转成图片(宿主没有 html2canvas,插件包也不提供截图 API)。
  • PDF 无法在页面上直接框选,需要先渲染成 PNG 再框选。
  • 截图坐标存在几个像素的不确定度(Windows 最大化窗口的不可见边框),必要时应预留 2–4px 余量。

Agent 侧 DPI-aware 截屏示例(PowerShell)

Add-Type -TypeDefinition @'
using System; using System.Runtime.InteropServices;
public class Dpi { [DllImport("user32.dll")] public static extern bool SetProcessDPIAware(); }
'@
[Dpi]::SetProcessDPIAware() | Out-Null
Add-Type -AssemblyName System.Windows.Forms,System.Drawing
$b = [System.Windows.Forms.SystemInformation]::VirtualScreen   # 现在返回 3200x2000
$bmp = New-Object System.Drawing.Bitmap($b.Width, $b.Height)
$g = [System.Drawing.Graphics]::FromImage($bmp)
$g.CopyFromScreen($b.X, $b.Y, 0, 0, $bmp.Size)
$bmp.Save('full.png', [System.Drawing.Imaging.ImageFormat]::Png)
$g.Dispose(); $bmp.Dispose()

得到整屏 PNG 后,直接用插件给出的「截图坐标」Rectangle(x, y, w, h) 裁剪即可,不要再乘 DPR。

适用场景

  • 需要把侧栏中的代码片段、图表、文档段落发给 AI 并附带标注。
  • 需要精确的截图坐标,以避免手动截图对不准。
  • Agent 需要在宿主侧执行 DPI-aware 截屏,以获得与用户所见一致的图像。

维护者与许可证

  • 维护者:ImpartialLucas
  • 许可证:MIT
  • GitHub:https://github.com/ImpartialLucas/dsh-image-annotate
  • 分类:客户端

总结

dsh-image-annotate 为 DSH 增加了一套完整的「右侧栏框选标注」流程:框选、注释、截图坐标、冻结帧,全部在插件内部完成,Agent 收到消息后即可按坐标裁出真实像素。这对需要精确标注和截图的场景很有帮助。

参考资源

  • GitHub:https://github.com/ImpartialLucas/dsh-image-annotate
  • npm:https://www.npmjs.com/package/dsh-image-annotate
  • SkillHub 目录页:https://www.skillhub.cn/plugins/ImpartialLucas/dsh-image-annotate
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye