Foreword

When chatting with an agent via the DeepSeek Harness Web interface, if you want it to read a PDF, a piece of code, or a compressed package, you will encounter a limitation: the official Web interface currently only supports pasting/dragging images; non-image files will prompt “Only images can be pasted.” Since files cannot enter the session workspace, the agent naturally cannot access the content.

The community plugin dsh-web-file-upload fills this gap. Below is an introduction to its features, installation method, and implementation principles.

What is it

dsh-web-file-upload is a file upload plugin provided for the DeepSeek Harness Web interface: it allows uploading arbitrary files (PDFs, documents, code, archives, etc.) via buttons, pasting, or drag-and-drop. Files are saved to the uploads directory of the session workspace and automatically include a file reference in the message, enabling the agent to read them directly.

  • GitHub Repository: rrvvvnnn/dsh-web-file-upload
  • npm Package Name: @iamroven/dsh-web-file-upload, version 0.1.0
  • License: MIT (stated in both README and package.json)
  • peerDependencies: @deepseek-ai/cordis ^4.0.1

Core Features

  • Folder button inside the input box (located to the left of the model selector); click to select files, supports multi-selection.
  • Paste files: Ctrl+V in the chat box (files copied from the file explorer) triggers automatic upload.
  • Drag files into the chat box for automatic upload.
  • Uploaded files are displayed as cards inside the input box; after applying the optional patch, they can be placed side-by-side with image thumbnails in the same area.
  • Images and files are mutually exclusive; you cannot add them simultaneously to avoid layout conflicts.
  • Files land in the session workspace uploads directory, and the agent can read them directly.
  • After the message is sent, the file cards in the input box are automatically cleared, leaving no residue for the next conversation.
  • Sent files are displayed as rounded cards in the chat history; clicking them opens the file directly.

Installation & Enablement

One command to complete download and registration:

dsh plugin --profile web add @iamroven/dsh-web-file-upload

The plugin declares dsh.bundle.patch, so dsh plugin add automatically appends this package to the profile’s bundle layer; no need to manually add lines to cordis.patch.yml.

After installation, restart the web service: close the “DSH Web Server” window, double-click the shortcut, and then hard refresh the browser.

Regarding the patch, there are two situations:

  1. It works normally without applying the patch; upload, paste, drag-and-drop, and agent reading all function correctly, and file cards are displayed at the bottom of the input box.
  2. The optional patch (found in CORE-PATCH.md in the repository) provides a better experience: file cards are placed side-by-side with image thumbnails in the same area, and clickable file cards are displayed in the chat history.

Usage Workflow

  1. After starting the web interface, a folder button appears to the right of the input box (to the left of the model selector).
  2. Click to select files, or directly drag files into the chat box / paste with Ctrl+V.
  3. Files appear as cards inside the input box, and the input box will have a line “Attachments: Filename”.
  4. Add your question and send. The agent will go to the uploads directory to read the file content.
  5. After sending, the input box cards are automatically cleared; in the chat history, your sent messages will display file cards that can be clicked to open the file directly.

Implementation Principle

This is a single-package dual-face (Dual-face) plugin, with the server side and browser side each occupying half.

The host half is lib/index.js, which registers two webServer routes:

POST /dsh-upload/put   Receives base64 file payload and writes it to the session workspace's uploads directory
GET  /dsh-upload/file  Returns file content by filename, allowing chat history cards to open on click

The client half is lib/client.js, a cordis client plugin: it registers the folder button and file cards in the input box slot, listens for document-level paste / drag events, and completes uploads by calling the host routes via fetch.

The directory structure inside the package is as follows:

package.json
LICENSE
README.md
CORE-PATCH.md
lib/index.js   Host half (server routes)
lib/client.js  Client half (browser bundle)

Applicable Scenarios & Notes

The suitable scenarios are clear: you are using DSH’s Web interface and want the agent to read local files directly—such as having the agent analyze PDFs, review code, or view archive contents—without needing to copy the files into the workspace yourself first.

Be aware of a few points when using it:

  1. Images and files are mutually exclusive and cannot be added simultaneously; this is an intentional layout constraint.
  2. The plugin runs with the permissions of the current dsh process and has the ability to write to the session workspace. It is recommended to read the source code and confirm the license before installation; this package is MIT.
  3. The GitHub repository belongs to rrvvvnnn, while the npm package prefix and the author field in package.json are @iamroven / iamroven; they are inconsistent. Please verify the maintainer’s identity yourself before installation.

Ending

With a single installation command, dsh-web-file-upload fills the missing file upload capabilities of the DSH Web interface. Files go straight to the session workspace, and the agent can read them out of the box. For those who often need to have the agent process local documents and code, this is a small but practical addition.

  • Community Directory: https://www.skillhub.cn/plugins/rrvvvnnn/dsh-web-file-upload
  • GitHub Repository: https://github.com/rrvvvnnn/dsh-web-file-upload