Back to home@runfali

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
GitHub repo

Introduction

dsh-paperclip

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 toggleSettings → 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