前言¶
DSH 会话里的助手回复经常同时带表格、引用图片和长段落。直接复制转发,表格会乱、图片只剩小预览、长文刷屏;用系统截屏,又会因为当前视口或滚动丢掉上下内容。这个插件要解决的问题就是把「这一条已经生成完毕的回复」按适合阅读的纸张重新排版,输出成一张完整的长 PNG,直接进剪贴板。
这是什么¶
geopanret/dsh-chat-share-image 是一个 DSH 客户端插件,由 Geopanret 维护,分类为客户端。它不改变谈话逻辑,只在每条已完成的助手回复按钮区(复制 / 好回答 / 有问题的回答那一排)新增一个相机按钮:点一下,就把这一条回复的完整内容渲染成 PNG 长图并写入系统剪贴板。Host 半边是空壳,所有逻辑都在浏览器里,不联网、不上传、零 Host 权限,无需重启 DSH。
核心功能¶
下面列出的是插件 README 中已说明的能力。
- 完整内容入图:渲染的是这一条回复的全部内容,而不是当前视口;代码块、公式、长文都完整。
- 表格重新排版:截图里取消表格横向滚动和单元格宽度上限,所有列、所有文字都显示,不缺列。
- 引用图片放大:界面上的 240/360px 小预览,在截图里按原图比例完整显示,不裁切。
- 长文本防溢出:长 URL、不可断词自动换行,不会把画布撑出边界。
- 输出后自检:写完 PNG 会解码回读,校验文件非空、PNG 尺寸与 canvas 一致,不悄悄给出坏图。
- 超长自动分段:超过单张可读高度时按段拆成多张,第 1 张进剪贴板,其余在 toast 里可逐张复制或下载;超过 6 张上限时明确拒绝并提示分段。
- 主题跟随:深 / 浅主题跟随当前页面。
- 剪贴板兜底:剪贴板不可用时可下载 PNG。
安装与启用¶
从 GitHub 发布版安装(推荐):
dsh plugin --profile desktop add github:Geopanret/dsh-chat-share-image#v0.2.0
首次安装走 HMR 生效;之后 client.js 的改动由 @deepseek-ai/dsh-client-hmr 热替换,无需重启 DSH。
本机开发可以 link 到工作区,在 DSH 会话里执行:
plugin_manager action=install_bundle target=D:\PLAYGROUND-DSHo\dsh-chat-share-image
安装由 plugin_manager 写入 profile(~/.dsh/profiles/desktop),不要手改 profile 的 package.json / cordis.patch.yml。卸载:
plugin_manager action=remove_bundle target=dsh-chat-share-image
典型用法¶
安装启用后,在任意一条已经完成的助手回复上,点按钮区新增的相机按钮即可。插件会在浏览器侧克隆这一行,套上只对截图生效的纸张排版层,然后光栅化成 PNG 写进剪贴板。
想验证插件本身是否正常,可以在仓库根目录跑:
node --check client.js
node test/smoke.mjs
README 记录的一次实时页面实测(agent-browser 拦截 navigator.clipboard.write 取 PNG 字节)覆盖了真实 5 列表格长回复拆成 1584×12316、引用图放大、深色主题、超长回复拆成 2 张等场景。
实现方式(简述)¶
全部逻辑在浏览器侧的 client.js,Host 半边的 index.js 是空壳。工作顺序是:注册按钮入口 → 按 slot 给的 messageId 定位回复行 DOM → 克隆后清理实时布局冻结值 → 套纸张排版层、展开滚动裁剪、重排表格、放大引用图 → 内联同源 / blob / data 图片与 webfont → 离屏测量后经 SVG <foreignObject> 以 2× 清晰度光栅化 → 回读校验 → 写入剪贴板或分段。其中 SVG 必须以 base64 data URL 交给 <img>,因为 Chromium 用 blob URL 装载含 <foreignObject> 的 SVG 会污染 canvas,toBlob 会直接抛 SecurityError。
适用场景与注意¶
适合需要在 DSH 里把回复分享出去的人:群发讨论、内部同步、留档截图。这张图不是界面原样截图,而是「按完整可读重新排版」的版本;表格和图片在截图里的呈现方式与界面滚动预览不同。
使用前注意几点:
- 插件以当前 dsh 进程权限运行,安装前应检查源码与许可证(README 标明为 MIT)。
- 超长回复会拆成多张 PNG,最多 6 张;单张仍受 32767px 边长 / 6400 万像素上限约束。
- 超过 2000px 宽的超长代码行会自动换行,保留内容但不保留原行宽。
- 跨域且没有 CORS 头的远程图片无法嵌入 canvas,会显示
[image: alt]占位并计数。 - 回复行定位依赖响应式内部的一些
data-*属性,DSH 结构变化时按钮会提示错误而不是崩溃,但需要适配。
目录页显示当前为 0 星。
结语¶
这个插件的价值在于把「转发一条回复」从手动截屏拼图,变成一次点击得到一张排版完整、可读的长图。实现集中在浏览器侧,Host 端只是空壳,配合 HMR,改 client.js 后无需重启。
目录页:https://www.skillhub.cn/plugins/Geopanret/dsh-chat-share-image
GitHub:https://github.com/Geopanret/dsh-chat-share-image