Zenjibad/dsh-any-attachment
dsh 捆绑包:在 DeepSeek Harness Web UI 中附加任意文件类型——文本类文件内联展示,二进制文件以工作区路径引用形式呈现,栅格文件则通过内置管道处理。
项目介绍Project Overview
dsh-any-attachment 是 DeepSeek Harness 的插件,允许在 Web UI 中通过无路径的 @-提及附加任意类型文件。支持输入 @ 选择工作区文件,或拖放/点击 + 上传本地文件。适合需要灵活引用非图片文件时使用。注意:单个文件大小上限为 25 MB。
dsh-any-attachment is a plugin for DeepSeek Harness (dsh) that enables attaching files of any type via pathless @-mentions in the Web UI. Type @ to pick a workspace file, or drop a file or use the + button to tag it into your message. Use it when you need flexible file references beyond images. Note: each file is limited to 25 MB.
请帮我了解并安装插件:【dsh-any-attachment】【https://github.com/Zenjibad/dsh-any-attachment】
把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.
或使用命令行安装(适合开发者)Or use CLI install (for developers)
命令行安装CLI Install
dsh plugin --profile web add https://github.com/Zenjibad/dsh-any-attachment
把 Zenjibad/dsh-any-attachment 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
dsh-any-attachment
A DeepSeek Harness (dsh) plugin bundle that lets the Web UI attach files of any type as pathless @-mentions: type @ to pick a workspace file, or drop a file (or use the + button) to tag it into your message — the agent then reads the file itself with its own tools. Mentions carry the name only, never a path. Raster images keep flowing through the built-in image pipeline. No changes to the harness repo, and nothing is written into your workspaces.
How mentions work
@-list: in the composer, type@and a menu shows the session workspace's files, recursively and flat (src/main.ts,docs/guide.md, …). Type more to filter; pick one and a pathless@namechip is inserted into the draft.- Drop / + button: drop a local file onto the composer (or click +) and it is stored privately; the draft gains an
@<stored-name>chip — no path, no drive letter. - Send as usual (Enter or the send button) — every mention chip resolves to its exact file location in the sent message (
@name (C:\...\absolute\path)), so the agent reads the file directly instead of guessing where it lives. - Raster images (png/jpeg/webp/gif) still route to the built-in image pipeline (vision models see them).
- Files live under
$DSH_HOME/attachments-any/— private, never dumped into a workspace.
Install
dsh plugin --profile web add https://github.com/Zenjibad/dsh-any-attachment
Restart dsh web, then hard-refresh the page.
Limits
| Guard | Value |
|---|---|
| Max bytes per file | 25 MB |
@-list depth |
4 levels below the workspace root |
@-list entries |
500 (sorted, /-separated relative paths) |
@-list exclusions |
hidden (.-prefixed) entries and node_modules |
| Name | basename only; traversal, separators, drive letters rejected |
| Storage | private store under $DSH_HOME/attachments-any, never a workspace |
How it works
- Host (
lib/): registers an RPC channel/attachments-any(authoritytrusted-host, same LAN fence as/api).list { sessionId }walks the session workspace recursively and returns relative paths;uploadvalidates base64/size/name, writes into the private store, and returns the stored name (deduped with-2suffixes). A system-prompt section tells the agent that a referenced@namelives at./<name>relative to its working directory, or in the private store otherwise. - Client (
client/): composer+button (conversation.input.left), a capture-phase drop handler, and an@fileinput-trigger source (workspace autocomplete, pathless picks). Rasters route throughcreateDraftImages/addImages; everything else uploads via the channel and the mention@<name>is appended to the composer draft viainputActions.setDraft.
The agent reads the file at the resolved path with its own tools — no extraction, no download UI, no special send flow.
Test
node --test
nexu-io/open-design
freestylefly/awesome-gpt-image-2
anywhere-labs/dsh-desktop
walkinglabs/learn-harness-engineering
awesome-dsh-plugin/awesome-dsh-plugin
MemTensor/MemOS