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.
No comments yet. Be the first to write one.