← 返回列表
未验证
DSHDeepSeek Harness对话工具插件:拖拽任意文件进入对话 + 选中文本引用。
尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/14 · 已提供中文文档
DSH(DeepSeek Harness)对话工具插件:拖拽任意文件进入对话 + 选中文本引用。
综合分
27.8
GitHub 分
27.8
用户评分
—
★ Stars
2
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add sharkymew/dsh-utility-tools该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
信任档位:仅索引本站尚未对其实装验证,仅收录元数据
- 是什么
- dsh 原生插件 · tool
- 装得上吗
- 本站尚未做安装检查
- 安全吗
- 本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
- 还在维护吗
- 更新放缓:最近一次提交在 42 天前
档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →
数据截至 2026/9/20(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
由 DeepSeek 最新模型翻译生成dsh-utility-tools
DSH(DeepSeek Harness)对话工具插件:拖拽任意文件进入对话 + 选中文本引用。
支持两种加载方式:静态挂载(dsh plugin add 一行命令安装,推荐)与动态加载(cordis_define,零依赖)。
功能
1. 拖拽文件附件(不限于图片)
- 拖入任意文件到对话区域即进入附件列表:输入框上方显示「📎 附件(N)」胶囊;
- 点击胶囊展开管理菜单:查看文件名/大小、逐个移除;
- 发送(Enter 或发送按钮)时随消息一并提交:
- Electron 环境:直接引用 File.path 原路径,不复制;
- 普通浏览器:字节无损暂存到系统临时目录(macOS/Linux 用 /tmp,Windows 用每用户 %TEMP%)下的 dsh-drops//,消息引用绝对路径,模型可直接读取;
- 文件内容不会出现在输入框或消息气泡里(只引用路径与大小),不污染工作目录;
- 图片拖拽仍走系统原生流程;图片与文件混拖时图片自动转交原输入栏。
2. 选中文本引用
- 在对话中鼠标选中文字 → 选区上方弹出「引用」菜单;
- 点击后选中文字显示在输入框上方(引用条),带「✕」取消;
- 发送时引用以 > 引用: 块置于消息开头一并提交。
目录结构
dsh-utility-tools/
├── README.md # 本文件(含导入指南)
├── package.json # 包声明:dsh.bundle(自动插入 entry)+ dsh.client(静态 Client 半区)
├── cordis.patch.yml # ★ bundle patch:- insert: 插入插件 entry(一行命令生效的关键)
├── LICENSE # MIT
├── .gitignore
├── lib/ # ★ 静态版(一行命令安装用)
│ ├── index.js # Host 入口(ESM,export default 插件,零依赖)
│ └── client.js # Client 半区(__ModuleLoader__.load 格式)
└── dynamic/ # 动态版(cordis_define 粘贴用,已验证)
├── host.body.js # code.host 函数体
└── client.body.js # code.client 函数体
如何导入(给使用者)
方式 B:静态挂载(一行命令,推荐 ✅)
安装到 web profile(包自带 dsh.bundle,entry 自动插入插件树)
dsh plugin --profile web add dsh-utility-tools
重启 dsh web 生效
- 包通过 dsh.bundle 声明(cordis.patch.yml 内的 - insert: 行)自动向插件树插入 entry,无需手动编辑任何 patch 文件;
- 安装命令等价于在 profile 目录执行 pnpm add;
- 行内 name 是模块说明符:loader 经 import(name) 加载包入口 main(Host ESM),client 模块表扫描 entry 的 dsh.client 声明并 serve ./client 导出(__ModuleLoader__ 格式);
- Host 半区注册 HTTP 路由 /dsh-utility-tools/save,Client 半区经同源 fetch 上传附件。
方式 A:动态加载(零依赖,已验证)
git clone
把 dynamic/host.body.js 与 dynamic/client.body.js 的全文交给你的 AI:
用 cordis_define 创建插件:code.host = dynamic/host.body.js 全文,code.client = dynamic/client.body.js 全文,然后 cordis_run 运行。
在 UI 中批准运行请求即可。动态插件是 DSH 一等公民特性,进程内加载、卸载即清理。
架构说明
| 层面 | 位置 | 职责 |
| --- | --- | --- |
| Client UI | conversation.input.dock(id file-drop-quote) | 引用条、附件胶囊/管理菜单;document 捕获阶段监听 drop/keydown/click/mouseup 等 |
| Client UI | conversation.input.overlay(id ref-menu) | 选区上方悬浮「引用」菜单 |
| Client→Host 通道 | 动态:host.call('save-dropped-file');静态:fetch('/dsh-utility-tools/save') | 发送时上传附件字节(base64) |
| Host | 动态:harness.handle;静态:webServer.register 路由 | 纯 JS base64 解码 → ctx.fs 写入系统临时目录 dsh-drops//(平台自适应 + 重名自动加序号)→ 返回绝对路径 |
关键技术点
- 字节无损:沙箱内置 atob 是 UTF-8 感知的(Buffer.from(b64).toString('utf-8')),会损坏非 ASCII 字节;Host 端使用纯 JS 手写 base64 解码器,逐字节精确还原;
- 沙箱兼容:/tmp 位于 workspace-write 策略的可写白名单(writableRoots = 工作区根 + /tmp + os.tmpdir()),模型侧工具可直接读写暂存文件;
- 写盘兜底:ctx.fs.writeText 传入 Uint8Array 时底层会在原子写盘后抛错(normalizeLineEndings 仅支持字符串),以 fs.stat 校验大小确认落盘成功;
- 发送拦截:document 捕获阶段拦截 Enter(textarea 焦点、非 IME 组合、非 Shift)与发送按钮点击(aria-label 匹配「发送消息 / Send message」),先合并引用/附件摘要到草稿再调用 inputActions.submit(),同时跳过 / 命令流与机器忙态;
- 深色模式:按钮使用 --dsw-alias-button-info-fill(明/暗均为蓝色底白字),避免 --dsw-alias-brand-primary 在深色下反转成近白色导致白字不可见。
已知限制
- 普通浏览器无法获取拖入文件的真实磁盘路径(平台安全设计),只能按名称引用或暂存到系统临时目录;Electron 环境(File.path)可直引原路径;
- 单文件上限 8MB(传输载荷约束),超出仅提示不暂存;
- 暂存目录平台自适应:macOS/Linux 用 /tmp,Windows 优先每用户 %TEMP%(C:/Users//AppData/Local/Temp),回退 C:/Windows/Temp 等;系统重启后临时目录可能被清空;
- 纯文本引用上限 2000 字符;
- 附件在发送时统一暂存,移除附件不会产生任何磁盘残留;
- 静态版 HTTP 路由仅监听回环地址且只写系统临时目录(受沙箱策略约束),已做最小暴露。
License
MIT