DeepSeek Harness Plugin

zhousun55-byte/dsh-postman

Stars ★ 0 Category UI Enhancements Added 2026-08-16

Upload files and folders straight into the conversation — images attach as real message blocks, text content is written into the composer draft, folders land by directory structure.

Install

# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)

dsh plugin --profile web add github:zhousun55-byte/dsh-postman

Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time. Only install sources you trust, and pin a commit (github:owner/repo#sha).

README

Mail files and folders straight into the conversation — no workspace copy, no path juggling. The entry lives in the composer's + command menu (/upload, with two options: upload files / upload folder), so the tool row stays uncluttered.

Why

  • Images attach as real image blocks — PNG/JPG/WebP/GIF (≤5 MiB) go through DSH's native attachment pipeline (composer thumbnails + message image blocks) and are transcribed on the model side by a vision bridge (e.g. modlens) — not just a path string. HEIC and oversized images fall back to path upload automatically.
  • Folder uploadwebkitdirectory uploads a whole directory tree into ~/.dsh/uploads/<timestamp>-<folder>/…; text file contents are written straight into the composer draft, so the model sees them immediately.
  • Zero dependencies, no build step — pure Node built-ins plus DSH's native pipeline.

Features

  • Upload files (multi-select):
    • Images (PNG/JPG/WebP/GIF, ≤5 MiB) attach as real image blocks through DSH's native attachment pipeline (composer thumbnails + message image blocks), converted on the wire by a vision bridge (e.g. modlens) exactly like pasted images; HEIC and oversized images fall back to path upload.
    • Text files → content is written into the composer as an inline code block;
    • Other binaries → path + size are injected; the model reads them with read.
  • Upload folder (Chrome webkitdirectory): stored under ~/.dsh/uploads/<timestamp>-<folder>/… with the directory structure preserved; the composer draft receives a file manifest, text previews (≈24k chars total cap), and binary paths. Images inside the folder (up to 12) attach as real images.
  • The native paste/drag image channel keeps working alongside.

Host half

POST /dsh-postman/upload?name=<file>[&dir=<root>][&rel=<relative-path>]

  • Single-file mode (no dir): stored at ~/.dsh/uploads/<timestamp>-<file>;
  • Folder mode (shared dir per batch): stored at ~/.dsh/uploads/<dir>/<rel>, directories auto-created, name collisions get -2/-3, never overwritten;
  • 25 MiB per file; dir may not contain path separators, rel is sanitized segment by segment and drops ..; dirs 0700, files 0600; cross-origin requests rejected;
  • Envelope: { ok: true, value: { name, path, root, size, kind, preview } } — for kind === 'text', preview carries the first 20k UTF-8 chars.

Install

Add this repository to the Web profile and declare the plugin row (dsh serves the browser half at /plugins/dsh-postman/client.js by package name):

  1. In ~/.dsh/profiles/web/package.json add "dsh-postman": "link:/path/to/dsh-postman" (or a versioned dependency once published);

  2. In ~/.dsh/profiles/web/cordis.patch.yml add:

    - insert:
        - id: ui-upload
          name: 'dsh-postman'
    
  3. pnpm --dir ~/.dsh/profiles/web install, restart dsh web (client-only changes need just a page refresh).

Self-check

node client.test.cjs   # headless client-logic verification (18 assertions)

License

MIT

Content from the project README on GitHub ↗

Links

More in this category

View the whole category →