DeepSeek Harness plugin

dsh-any-attachment

Lets the DSH web UI attach files of any type as pathless @-mentions: pick a workspace file from the @ menu or drop one into the composer, and the agent reads it directly.

Jump to install

Source facts

Repository
Zenjibad/dsh-any-attachment
Latest update
Aug 20, 2026
Category
UI Enhancements
GitHub stars
0

Install

Start with a prompt that asks an agent to read the source. Switch to the command if you want to install it yourself.

Copy this prompt into DSH, Codex, or another agent and ask it to read the page and repository first.

Do not install anything yet. Read this DeepSeek Harness plugin and explain what it does, which files, networks, or credentials it can access, and how to install and remove it.

Plugin page: https://deepseekplugins.org/plugins/Zenjibad/dsh-any-attachment
GitHub: https://github.com/Zenjibad/dsh-any-attachment
Plugin: dsh-any-attachment
Author: Zenjibad
Install command: dsh plugin --profile web add github:Zenjibad/dsh-any-attachment

Do not run the install command until I confirm.

Check the source files

Read the README and other files from this plugin directory before installing.

File explorer3 files
README.mdSource · read only

dsh-any-attachment

A DeepSeek Harness (dsh) plugin bundle that lets the Web UI attach files of any type as pathless @-mentions: type @ to pick a workspace file, or drop a file (or use the + button) to tag it into your message — the agent then reads the file itself with its own tools. Mentions carry the name only, never a path. Raster images keep flowing through the built-in image pipeline. No changes to the harness repo, and nothing is written into your workspaces.

How mentions work

  • @-list: in the composer, type @ and a menu shows the session workspace's files, recursively and flat (src/main.ts, docs/guide.md, …). Type more to filter; pick one and a pathless @name chip is inserted into the draft.
  • Drop / + button: drop a local file onto the composer (or click +) and it is stored privately; the draft gains an @<stored-name> chip — no path, no drive letter.
  • Send as usual (Enter or the send button) — every mention chip resolves to its exact file location in the sent message (@name (C:\...\absolute\path)), so the agent reads the file directly instead of guessing where it lives.
  • Raster images (png/jpeg/webp/gif) still route to the built-in image pipeline (vision models see them).
  • Files live under $DSH_HOME/attachments-any/ — private, never dumped into a workspace.

Install

dsh plugin --profile web add https://github.com/Zenjibad/dsh-any-attachment

Restart dsh web, then hard-refresh the page.

Limits

GuardValue
Max bytes per file25 MB
@-list depth4 levels below the workspace root
@-list entries500 (sorted, /-separated relative paths)
@-list exclusionshidden (.-prefixed) entries and node_modules
Namebasename only; traversal, separators, drive letters rejected
Storageprivate store under $DSH_HOME/attachments-any, never a workspace

How it works

  • Host (lib/): registers an RPC channel /attachments-any (authority trusted-host, same LAN fence as /api). list { sessionId } walks the session workspace recursively and returns relative paths; upload validates base64/size/name, writes into the private store, and returns the stored name (deduped with -2 suffixes). A system-prompt section tells the agent that a referenced @name lives at ./<name> relative to its working directory, or in the private store otherwise.
  • Client (client/): composer + button (conversation.input.left), a capture-phase drop handler, and an @file input-trigger source (workspace autocomplete, pathless picks). Rasters route through createDraftImages/addImages; everything else uploads via the channel and the mention @<name> is appended to the composer draft via inputActions.setDraft.

The agent reads the file at the resolved path with its own tools — no extraction, no download UI, no special send flow.

Test

node --test

License

[MIT](LICENSE)