reyesyang
dsh-plugin-file-drop
DSH 文件拖拽上传插件:把本地文件拖到对话框,保存到系统临时目录 dsh-file-drop/ 并写入输入框(支持 Linux/macOS/Windows)
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 14, 2026
- Updated
- Aug 14, 2026
Introduction
DSH File Drop Plugin(文件拖拽上传插件)
DeepSeek Harness(DSH)动态 Cordis 插件:把本地文件直接拖拽到对话框,文件自动保存到系统临时目录下的 dsh-file-drop/ 文件夹(便于系统自动清理),并把绝对路径写入输入框,作为任务输入交给 Agent 处理。
功能
- 拖拽文件到页面任意位置,显示全屏遮罩提示「松开鼠标,添加文件到任务输入」
- 松开后自动上传:文件保存到系统临时目录
dsh-file-drop/<文件名>(同名自动追加-2、-3序号) - 三平台支持:Linux / macOS 用
$TMPDIR(缺省/tmp),Windows 用%TEMP%,均与沙箱可写根集合一致 - 保存成功后,文件绝对路径自动追加到输入框草稿,用户补充任务描述即可发送
- 右下角 toast 反馈保存结果(成功 / 失败原因)
- 文件名安全处理:basename 清洗(防路径穿越)、控制字符剔除、Windows 非法字符(
<>:"|?*)替换、保留设备名(CON/NUL 等)规避、80 字符截断 - 写入受会话沙箱策略约束(
sandboxPolicy.resolve({ session }));workspace-write模式下系统临时目录本身就在沙箱可写根集合内
限制
| 项目 | 限制 |
|---|---|
| 单次文件数 | ≤ 6 个 |
| 单文件大小 | ≤ 2MB |
| 合计大小 | ≤ 8MB |
| 文件类型 | 仅 UTF-8 文本文件(二进制文件会明确报错,因为 DSH fs 服务没有字节写入能力) |
安装(DSH Web GUI)
-
打开 DSH Web GUI 的任意会话,向 Agent 发送如下安装指令:
请安装 dsh-file-drop 插件(仓库 https://github.com/reyesyang/dsh-file-drop-plugin):
- 用 web_fetch 读取仓库中的两个文件:
- 用 cordis_define 定义插件:plugin 为 { kind: "new", idPrefix: "fdrop" },name 填 "File Drop",purpose 填 "把拖入的本地文本文件保存到系统临时目录 dsh-file-drop/ 并回填输入框",code.host 与 code.client 分别填入上述两个文件的内容
- 用 cordis_run(mode: "run")激活
-
打开左下角设置上方的「Cordis Plugin」面板,对出现「待审批」的插件点击批准:
- ✓(仅允许此版本):授权当前这一版代码
- ✓✓(允许此插件的后续版本):今后同一 pluginId 的更新无需再次审批
- 也可以在会话里的 Run 卡片上完成同样的批准操作
-
批准后插件立即生效。面板中还可以运行 / 停止 / 移除插件;代码更新后可在面板中切换版本或回退。
插件运行期内的全部副作用(监听器、样式、RPC handler)都挂在 Cordis Fiber 上,stop / update / undefine 时自动清理。
使用
-
打开任意会话;
-
从本地把文本文件(日志、代码、配置、文档……)拖到页面任意位置;
-
松手后路径出现在输入框中,例如:
/tmp/dsh-file-drop/app.log (Linux) /var/folders/…/T/dsh-file-drop/app.log (macOS,由 $TMPDIR 决定) C:\Users\…\AppData\Local\Temp\dsh-file-drop\app.log (Windows,由 %TEMP% 决定) -
补充任务描述发送,例如:「分析 /tmp/dsh-file-drop/app.log 中的报错」。
文件结构
| 文件 | 说明 |
|---|---|
host.js | Host 半插件(code.host 函数体):harness.handle('drop-upload') 接收 base64 内容,shell 获取系统临时目录并建 dsh-file-drop/ 目录,fs.writeText 落盘 |
client.js | Client 半插件(code.client 函数体):注册 conversation.input.overlay 槽位,监听 dragenter/dragover/dragleave/drop,读取文件并经包私有 RPC 上传,成功后用 inputActions.setDraft 回填路径 |
README.md | 本文档 |
实现要点
- Client:
conversation.input.overlay(session 作用域)注册一个条目,组件平时渲染null,拖拽激活时渲染全屏遮罩;文件读取用TextDecoder('utf-8', { fatal: true })检测是否为文本,base64 编码后经host.call('drop-upload', ...)上传。 - Host:用
sandboxPolicy.resolve({ session })解析当前会话策略;由 workspace/cwd 探测平台(盘符或 UNC 开头即 Windows),shell按平台执行 bash / pwsh 命令取系统临时目录、建dsh-file-drop/目录并输出绝对路径;路径分隔符随平台(\//);fs.writeText写入(写失败按文件返回错误);所有返回均为 lossless JSON。 - 草稿回填:
useInput是 selector 型 hook(SnapshotSelectorHook<T>),必须传选择器调用:props.useInput((s) => s.draft),再用inputActions.setDraft写回完整草稿。
兼容性
- 面向 DeepSeek Harness 动态 Cordis 插件机制(
cordis_define的code.host/code.client函数体格式,纯 JavaScript,无 import/JSX/TypeScript)。 - 三平台兼容(Linux / macOS / Windows):Windows 上 DSH 挂载 pwsh shell 栈(
pwsh-sandbox/tool-pwsh),POSIX 上挂载 bash 栈(bash-sandbox/tool-bash),本插件按探测结果选择对应方言;Windows 的 fs 围栏 containment 大小写不敏感,%TEMP%路径可正常通过workspace-write检查。 - 使用到的公开契约:
conversation.input.overlaySlot、harness.handle/host.call、fs/shell/sessions/sandboxPolicy/timer服务、主题变量--dsw-alias-*。
License
MIT