dsh-attachments
Bring any file into the conversation — stashed to the workspace and referenced by path; zero type rejection
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:CocoSgt/dsh-attachments说明文档
阅读完整 README ↗dsh-attachments
简体中文 | English
npm 包名:dsh-attachments · GitHub 仓库:
CocoSgt/dsh-attachments
DeepSeek Harness(dsh)的第三方附件插件:把任何文件带进会话,零类型拒绝。
- 所有文件(含图片)统一走暂存管线:文件落盘到会话工作区
/.dsh/uploads/并按会话暂存,composer 上方出现卡片(图标块 + 文件名 + 大小 + ✕)。不再使用宿主原生图片草稿管线 (createDraftImages/addImages均未使用);模型需要看图时,用 harness 原生的read_image工具按路径读取——非视觉模型也不会被「模型不支持 图片」堵住发送。 - 草稿完全干净,输入框里绝不出现引用文本。用户下一条消息进入模型
请求时,宿主在
agent/pre-step波形里把附件清单折进批次,作为source: { kind: 'user' }的消息(插在你的消息之前,与官方 dsh-agent-instructions 的注入模式同构)——模型可见即落日志,回放安全。 注入(消费)后卡片自动消失。 - 认不认、怎么处理,是模型和它的工具/技能的事。插件不做类型预判,也就 没有「不支持的格式」这种拒绝;唯一的硬限制是单文件 32MB 的 RPC 传输 上限(更大的文件直接放进项目目录再在消息里写路径)。
入口
- 回形针按钮(输入框工具栏左端):文件选择器,多选,无 accept 过滤;
- 全窗拖拽:拖文件进窗口出现遮罩提示,松手即带入;
- 粘贴:文件粘贴直达同一分诊;粘贴含附件引用行(
📎 … → .dsh/uploads/…, 如从历史消息复制)的文本时自动再物化成卡片。
附件卡片
落盘的附件在 composer 上方(conversation.input.dock)逐个成卡:扩展名
图标块 + 文件名 + 大小 + ✕。✕ 同时移出暂存并删除落盘文件;图片卡带本地
缩略图。卡片以宿主 pending 为真相源(listStash),经 2 秒轮询刷新——
发送消费后卡片自动消失。点卡片打开预览弹层:图片直接渲染,文本/代码按
纯文本渲染,其余类型提供「用系统应用打开」;弹层头部的「复制引用」复制
的是附件的文本协议形态,粘贴回输入框即等同重新携带。
架构
- 宿主端(
lib/index.js):AttachmentsGateway继承TypertRemoteService,以fileStash命名空间提供六个 RPC:stashFile/removeStash/restageFile/clearStash/readStash/listStash。路径安全:只写/.dsh/uploads/,文件名白名单化 + 时间戳前缀,撤回/预览路径 resolve 后做前缀校验。第三方双副本场景下 SRC 发现失明,同时注册弱(src-json)清单进宿主 typert registry。 - 浏览器端(
lib/client.js):$mount 手写 strict zod 描述符,暴露ctx.remote.fileStash;按钮注册conversation.input.left,卡片栏注册conversation.input.dock;全窗拖拽/粘贴经 store 捕捉的「当前 composer」 上下文路由到目标会话。宿主在agent/pre-step把暂存附件折进决策。 - 国际化:zh/en 双语词典经宿主 locale 服务注册(命名空间
dsh-attachments)。槽组件拿到标准响应式t席位;窗口级模块(拖拽 遮罩、预览、历史卡、分诊 toast)经命名空间绑定的 t 在调用时取词。宿主 RPC 失败携带稳定 dot-code 与 模板参数(如 + ),同时保留中文兜底文案——客户端词典命中 code 即本地化渲染,未命中回退兜底。注入模型历史的 引用行 是文本协议,绝不本地化。