dsh-paperclip

August 24, 2026 Β· View on GitHub

A zero-intrusion bundle for DeepSeek Harness: πŸ“Ž upload button with popover Β· read_document multi-format reader Β· Settings β†’ General toggle. Adapts to light / dark themes.

License: MIT Node.js >= 22 Version

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_document tool β€” Read txt / json / conf / md / ini / pdf / docx / xlsx with offset / limit paging. Text formats work zero-dependency; pdf / docx / xlsx show 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 bundle plugin, no DSH source changes.

Requirements

  • DeepSeek Harness dsh >= 0.1.0-rc.8 (web profile)
  • 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):

FieldDefaultDescription
enabledtrueShow button and enable uploads
maxBytes67108864Per-upload byte cap
uploadDir""Persist directory; empty β†’ ~/.dsh/uploads/paperclip (content-addressed, deduped)
allowedExtensions[]Whitelist (empty = allow all)
readLimit2000read_document line window
maxFileBytes67108864read_document per-file byte cap
sheetRowLimit200xlsx 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-origin Origin, Sec-Fetch-Site check; only POST / DELETE.
  • Byte cap checked twice, filename sanitized, DELETE confined to uploadDir.
  • 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 / xlsx need optional deps (pnpm add pdf-parse mammoth xlsx inside the plugin directory); text formats work without them.

License

MIT