dsh-paperclip
dsh 零侵入式 bundle 插件:📎 输入框上传按钮 + 待发送文件浮层(仅文件名,可移除)· read_document 多格式读取工具(txt / pdf / docx / xlsx / json / md / ini / conf,支持 offset/limit 分页)· 设置 → 通用设置一个开关。标准 Cordis bundle 插件,不改 DSH 源码,内容寻址落盘去重,深浅色主题自适应。
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 24, 2026
- Updated
- Aug 24, 2026
Introduction
dsh-paperclip
A zero-intrusion bundle for DeepSeek Harness: 📎 upload button with popover ·
read_documentmulti-format reader · Settings → General toggle. Adapts to light / dark themes.
English | 中文
Features
- 📎 Upload button + popover — Borderless 📎 button in the composer. A small ▴ next to it shows the count; click to expand upward and see pending files (filename only). Click × to remove. Files are uploaded immediately and the server path is appended to the message on send.
read_documenttool — Readtxt / json / conf / md / ini / pdf / docx / xlsxwithoffset/limitpaging. Text formats work zero-dependency;pdf / docx / xlsxshow a hint when optional deps are missing.- One toggle — Settings → General has an “Enable file uploads” switch. Off hides the button and blocks uploads. No extra tabs.
- Theme-aware — Uses DSH design tokens, looks correct in light and dark mode.
- Zero-intrusion — Standard Cordis
bundleplugin, no DSH source changes.
Requirements
- DeepSeek Harness
dsh >= 0.1.0-rc.8(webprofile) - Node.js
>= 22
Install
git clone https://github.com/runfali/dsh-paperclip.git
cd dsh-paperclip
pnpm install
pnpm build # builds lib/client.js (browser bundle)
dsh plugin --profile web add .
# restart manually: dsh web
Uninstall:
dsh plugin --profile web remove dsh-paperclip
Restart dsh web to apply.
Configuration
Edit in Settings → Plugin Config → paperclip or override in ~/.dsh/profiles/web/cordis.patch.yml (full replacement):
| Field | Default | Description |
|---|---|---|
enabled | true | Show button and enable uploads |
maxBytes | 67108864 | Per-upload byte cap |
uploadDir | "" | Persist directory; empty → ~/.dsh/uploads/paperclip (content-addressed, deduped) |
allowedExtensions | [] | Whitelist (empty = allow all) |
readLimit | 2000 | read_document line window |
maxFileBytes | 67108864 | read_document per-file byte cap |
sheetRowLimit | 200 | xlsx rows kept per sheet |
Example:
- id: paperclip
config:
enabled: true
maxBytes: 67108864
uploadDir: ""
allowedExtensions: []
readLimit: 2000
maxFileBytes: 67108864
sheetRowLimit: 200
Usage
Upload: Click 📎 to pick files. If needed, click ▴ to expand the list above the input; × removes a file. Type a message and Send — the list clears and paths are sent with the message.
Read: The model calls read_document({ file_path, format: "auto", offset: 1, limit: 2000 }).
Security
- Only loopback
Host, same-originOrigin,Sec-Fetch-Sitecheck; onlyPOST/DELETE. - Byte cap checked twice, filename sanitized,
DELETEconfined touploadDir. - Default dir
~/.dsh/uploads/paperclip, content-addressed and deduped.
Known Limitations
- Pending list is in-memory; reload clears it (files remain).
- No GC — only × deletes.
pdf / docx / xlsxneed optional deps (pnpm add pdf-parse mammoth xlsxinside the plugin directory); text formats work without them.