dsh-inline-image-ref:把输入框里的图片当 @路径 引用处理

前言

在 DSH 客户端里拖入或粘贴图片,默认往往会走附件栏上传管线。如果你希望图片像普通文件引用一样落在光标处、不占附件区,同时仍能让模型按路径读图,就需要在官方分流逻辑之外做一层客户端行为调整。下面介绍维护者 Da0Mine 发布的客户端插件 dsh-inline-image-ref:它把拖入、粘贴、文件选择器进来的图片改成在光标处插入 @路径 胶囊,并支持悬停预览原图。

这是什么

dsh-inline-image-ref 是 DSH 生态里的客户端插件(dsh-client,platform: web,immediately: true)。一句话定位:拖进输入框的图片按文件引用处理——不弹附件栏,在光标处插 @路径 胶囊;鼠标悬停胶囊可看原图。

插件以当前 DSH 进程权限运行;安装前请自行核对源码与许可证。

核心行为

官方在 dsh-client-ui-conversation 里用 MIME 与路径判断图片是走上传还是引用。本插件在不改官方核心代码的前提下,分两条路处理。

有真实 OS 路径的图片

桌面端拖入、带路径的粘贴、文件选择器选中的图片:在 drop / paste / change 的 capture 阶段把对应 File 的 type 抹成 application/octet-stream,官方判断就会走 insertFileReferences(),在实时选区(光标)之后插入 @路径 胶囊。光标定位、前导空格、撤销、忙碌态拒绝、@路径 格式化仍由官方实现。

没有路径的图片(剪贴板截图 / 位图)

客户端 Remote 的 workspaceFiles 只读,无法直接写盘。插件带 Host 半,提供保存路由:

POST /dsh-inline-image/save?name=<文件名>&sessionId=<会话 id>

请求体为文件字节;响应形如 { ok: true, value: { path, name, originalName, dir } }。

落盘目录与 WorkBuddy 临时图类似,在系统临时目录下:

%TEMP%\dsh-inline-image\<sha256 前 2 位>\<名字>-<sha256 前 16 位>.<ext>

要点:内容寻址(同图重复粘贴同路径,只刷新 mtime);24 小时 TTL 扫过期文件;不向项目目录写入;单文件上限 32MB。保存成功后客户端用 caretSpan() + insertReference() 在光标处插 @<绝对路径> 胶囊。失败则退回原生附件管线。

缩略图与悬停预览通过 remote.workspaceFiles.readBytes(sessionId, 绝对路径) 读字节,不另建读路由。

入口对照

入口 带真实 OS 路径的图片 没有路径的图片 普通文件
拖入 光标处 @路径 胶囊 落盘后 @绝对路径 原生 @路径(不变)
Ctrl+V 同上 同上(截图也能变文件) 不变;带文字时交回原生
文件选择器 光标处 @路径 胶囊 同上 不变

悬停引用胶囊时浮层显示原图(读不到则说明),pointer-events: none,不挡点击。已发送消息里符合规则的蓝色 @路径 链接也可悬停预览,范围限于输入框与聊天转录相关 DOM([data-composer-card]、[data-composer-input]、[data-chat-turn]、[data-chat-flow] 等);整段须为单一引用,夹在句子里的片段不触发。

复制粘贴草稿不退化

官方复制胶囊会得到 clipboardText(@"路径" 文本),粘回往往只剩文字。插件在 paste 的 capture 阶段识别「带图片扩展名的 @路径」,按原顺序用 insertText 与 insertReference 重建;仅在这类粘贴上接管,普通文字与非图片 @ 引用仍交给官方。代价:此类粘贴为纯文本重建,富文本格式(如加粗)不保留。

安装与启用

推荐从 npm 安装:

npm install dsh-inline-image-ref

手工接入桌面 profile 时,编辑 ~/.dsh/profiles/desktop/package.json,在 dependencies 与 dsh.profile.bundles 中加入本包,并在 node_modules 建同目录 Junction。示例结构(bundles 中需包含现有条目与本插件名):

{
  "dependencies": { "dsh-inline-image-ref": "link:./node_modules/dsh-inline-image-ref" },
  "dsh": { "profile": { "bundles": [ "…", "dsh-inline-image-ref" ] } }
}

修改后重启 DSH 宿主(客户端 bundle 在启动时聚合)。

环境要求:node >= 22(见 package.json engines)。

典型用法

  1. 在对话输入框中,从资源管理器拖一张本地图片到光标位置 → 出现 @路径 胶囊,附件栏不出现图片上传项。
  2. 截屏后 Ctrl+V → 无路径位图先 POST 到 Host 落临时目录,再插入 @绝对路径 胶囊。
  3. 鼠标悬停胶囊或消息里符合条件的 @路径 链接 → 浮层预览;模型侧仍通过路径让 DSH fs 沙箱读取(对工作区与平台临时根的写/读策略与官方一致)。

需要长期可复现的图:不要只依赖 %TEMP% 下 24 小时 TTL 的副本,应把图放进工作区再从资源管理器拖入(走原路径引用,不受 TTL 影响)。

适用场景与注意

适合谁

  • 习惯在提示词里用 @文件 引用、希望图片与文本混排在同一输入流里的 DSH 桌面/Web 客户端用户。
  • 不想让每张图都占附件栏、但仍要模型按路径读图的多模态或文本+工具读文件工作流。

已知限制(README 原文)

  • 文件名到绝对路径的映射记在 localStorage["dsh-inline-image/labels/v1"](最多 300 条);不同目录同名图会互相覆盖,仅最后一张能预览。
  • 未经本插件插入的 @图片(手打路径或其它插件)通常无法预览(Lexical 装饰节点可能只有 title)。
  • 临时目录文件 24 小时后清理,隔天再引用可能「读不到这张图」;工作区路径不受影响。
  • 交给模型的是路径引用而非内联图片字节;文本模型需自行读文件,多模态也不会自动把图塞进上下文——这是「按文件处理」的设计取舍。

权限与安全

插件含客户端注入与 Host 写临时目录路由;安装前应阅读 client.js、补丁与 Host 路由实现。DSH 社区目录(如 SkillHub)为独立站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-inline-image-ref 把输入框里的图片统一成光标处的 @路径 引用,并补上悬停预览与无路径截图落盘,在尽量复用官方引用管线的前提下减少附件栏干扰。需要插件条目与讨论可参考目录页 https://www.skillhub.cn/plugins/Da0Mine/dsh-inline-image-ref,问题与源码见 https://github.com/Da0Mine/dsh-inline-image-ref。

羽毛球分组比赛记分
小程序二维码

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

小夜