Back to home

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)

  1. 打开 DSH Web GUI 的任意会话,向 Agent 发送如下安装指令:

    请安装 dsh-file-drop 插件(仓库 https://github.com/reyesyang/dsh-file-drop-plugin):

    1. 用 web_fetch 读取仓库中的两个文件:
    2. 用 cordis_define 定义插件:plugin 为 { kind: "new", idPrefix: "fdrop" },name 填 "File Drop",purpose 填 "把拖入的本地文本文件保存到系统临时目录 dsh-file-drop/ 并回填输入框",code.host 与 code.client 分别填入上述两个文件的内容
    3. 用 cordis_run(mode: "run")激活
  2. 打开左下角设置上方的「Cordis Plugin」面板,对出现「待审批」的插件点击批准:

    • ✓(仅允许此版本):授权当前这一版代码
    • ✓✓(允许此插件的后续版本):今后同一 pluginId 的更新无需再次审批
    • 也可以在会话里的 Run 卡片上完成同样的批准操作
  3. 批准后插件立即生效。面板中还可以运行 / 停止 / 移除插件;代码更新后可在面板中切换版本或回退。

插件运行期内的全部副作用(监听器、样式、RPC handler)都挂在 Cordis Fiber 上,stop / update / undefine 时自动清理。

使用

  1. 打开任意会话;

  2. 从本地把文本文件(日志、代码、配置、文档……)拖到页面任意位置;

  3. 松手后路径出现在输入框中,例如:

    /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% 决定)
    
  4. 补充任务描述发送,例如:「分析 /tmp/dsh-file-drop/app.log 中的报错」。

文件结构

文件说明
host.jsHost 半插件(code.host 函数体):harness.handle('drop-upload') 接收 base64 内容,shell 获取系统临时目录并建 dsh-file-drop/ 目录,fs.writeText 落盘
client.jsClient 半插件(code.client 函数体):注册 conversation.input.overlay 槽位,监听 dragenter/dragover/dragleave/drop,读取文件并经包私有 RPC 上传,成功后用 inputActions.setDraft 回填路径
README.md本文档

实现要点

  • Clientconversation.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_definecode.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.overlay Slot、harness.handle / host.callfs / shell / sessions / sandboxPolicy / timer 服务、主题变量 --dsw-alias-*

License

MIT