dsh-file-intake
DeepSeek Harness Web 插件:让输入框支持任意文件(文档 / 压缩包 / PDF / 音视频……),
同时完整保留原生图片附件管线。
由 爱吃冬菇的蘑菇(Mogu) 开发维护。
行为
| 操作 | 结果 |
|---|
| 拖入/粘贴纯图片 | 完全不干预 → 原生附件管线(缩略图、视觉桥接)照旧 |
| 拖入/粘贴含非图片(含混合批次) | 拦截 → 上传到会话工作区 .dsh/uploads/<日期>/ → 输入框上方出现文件卡片(图标 + 文件名 + 大小 + ✕ 移除),输入框保持干净 |
| 拖入整个文件夹 | 递归收录全部文件,保留目录结构落在 .dsh/uploads/<日期>/<文件夹>/…,每个文件一张卡片 |
| 点击工具行 📎 按钮 | 系统文件选择器多选,走同一流程;按钮带待发送数量徽标 |
点击 发送 的瞬间,插件把所有卡片的 @相对路径 自动追加进消息(用户全程看不到路径文本),
模型收到形如 @.dsh/uploads/2026-02-03/report.zip 的引用,可直接用 read
等工具读取(压缩包可配合 local-file-handler 技能解包)。
细节:
- 空输入框加入首个文件时,草稿里会放一个不可见的零宽占位符(U+200B),
让原生的"空草稿"判定通过、发送按钮保持可用;输入框看起来仍是空的。
发送瞬间占位符被清洗掉,消息里不会残留。
- 移除卡片只是把它从待发送列表去掉;已上传的文件仍保留在工作区
.dsh/uploads/。
- 左键点击卡片:用系统默认程序打开该文件(压缩包/文档/音视频…);
右键点击卡片:在资源管理器中定位并选中该文件。
- 卡片行的宽度/边距复用原生 dock 几何变量(side-clearance / dock-inset /
card-max-width),与下方输入卡片左右边缘对齐。
- 若 submit 包装不可用(异常兜底),自动退回 v0.1 行为:
@路径 直接写入草稿。
边界
- 单文件 ≤ 64MB(base64 经 typert JSON 通道,传输上限 160MB 内留足余量)
- 文件夹拖入:递归深度 ≤ 12 层,单次最多收录 400 个文件(超出截断并提示);
目录名逐段净化,
.. 等穿越段直接丢弃,宿主端二次校验
- 需要会话已选择工作区(文件落在工作区内,会话间隔离)
- 重名自动加
-2/-3 后缀,不覆盖
- 文件名净化:去路径成分、危险字符剔除、空白折叠为下划线
- 斜杠命令提交不携带文件卡片(与图片附件的命令白名单语义一致)
结构
lib/index.js 宿主半区:Typert 远程服务 fileIntake.upload(zod 校验 + fs 落盘)
lib/client.js 浏览器半区:window 捕获级 paste/drop 拦截 + 📎 按钮
+ conversation.input.dock 卡片行 + submit 注入 @路径
cordis.patch.yml 组合行(dsh plugin add 自动追加 bundle)
安装 / 卸载
# 1. 克隆本仓库
git clone https://github.com/mogudesu/dsh-file-intake.git
# 2. 安装(自动追加到 profile bundles,路径换成你的克隆位置)
dsh plugin --profile web add "link:<克隆路径>\dsh-file-intake"
# 重启 dsh web 生效
# 卸载
dsh plugin --profile web remove dsh-file-intake -w
更新记录
0.3.0
- 文件夹拖入:通过
webkitGetAsEntry 递归遍历拖入的文件夹(含混合批次),
保留目录结构上传到 .dsh/uploads/<日期>/<文件夹>/…;每个文件一张卡片,
左键打开 / 右键定位照常可用。宿主 upload RPC 新增可选 dir 参数,
逐段净化目录名并限制深度 ≤16 段,杜绝路径穿越。
- 防护上限:递归深度 ≤12、单次 ≤400 个文件,超出截断并提示。
- entry API 不可用的浏览器自动退回扁平文件拖入。
0.2.2
- 修复:加入文件后输入框不再出现「请查看附件:」提示词。改为写入不可见的
零宽占位符(U+200B)撑住"空草稿"判定,发送按钮保持可用;submit 包装在发送
瞬间清洗占位符并注入 @路径,消息与输入框都不留痕迹。
0.2.1
- 对齐修复:卡片行此前是全宽行,与居中的输入卡片明显错位;现在复用原生
goal-bar 的 dock 几何(
--dsh-composer-side-clearance / --dsh-composer-dock-inset
/ --dsh-composer-card-max-width + margin: 0 auto),左右边缘与输入卡片对齐。
- 打开文件:左键点击卡片用系统默认程序打开;右键在资源管理器中定位选中。
新增宿主 RPC
fileIntake.open/reveal,路径解析带三重护栏
(拒绝绝对路径 / 工作区包含校验 / stat 确认存在)。
0.2.0
- 新交互:非图片文件不再往输入框写
@路径 文本,而是像原生图片附件一样
显示为输入框上方的文件卡片行(图标 / 文件名 / 大小 / ✕ 移除,📎 按钮带数量徽标)。
- 注入式发送:包装会话
inputActions.submit,点击发送瞬间把卡片的
@相对路径 追加到消息末尾并清空队列;输入框全程保持干净。
- 空草稿加入首个文件时预填「请查看附件:」,避免发送按钮因空草稿禁用。
- 包装失败时自动回退 v0.1 的直接写草稿行为;拖入提示层文案同步更新。
0.1.1
- 修复:拖入压缩包等非图片文件后,原生“图片拖动到此处即可添加”遮罩
永不消失的问题(接管 drop 时
stopPropagation 挡掉了原生遮罩的复位监听,
现在补发一个合成 dragend 让它立即隐藏)。
- 优化:拖拽悬停期间,若批次含非图片文件,显示本插件自己的提示层
(“松开鼠标,添加任意文件”,盖过原生的图片提示);纯图片拖拽仍显示原生遮罩。
作者
爱吃冬菇的蘑菇(Mogu)
如果这个插件对你有帮助,欢迎去 Bilibili 关注作者,或给本仓库点一个 ⭐ Star。
开源协议
本项目采用 CC BY-NC 4.0(署名—非商业性使用 4.0 国际) 协议发布。
| 你可以 | 条件 |
|---|
| ✅ 复制、分发本插件 | 必须注明作者(爱吃冬菇的蘑菇)与本仓库链接 |
| ✅ 修改、二次开发 | 仅限非商业用途,且同样注明作者 |
| ❌ 商业使用 | 未经作者授权,不得用于商用产品、付费服务或商业分发 |
商业授权 / 合作请通过 Bilibili 主页 联系作者。
Copyright (c) 2026 爱吃冬菇的蘑菇(Mogu)