dsh-file-download
Manifest validPlugin
dsh-file-download
English | 中文
Download the files an Agent delivers, straight from the DSH Web GUI.
Why this exists
DSH's Web GUI can already open a delivered file on the Host desktop. That is
exactly the wrong affordance when the Host is a cloud server: there is no local
folder to open. dsh-file-download adds the missing transport — the browser
downloads the file instead.
It lists every file the Agent declared through the present tool in the current
Session, and hands each file (or all of them as one ZIP) to the browser's own
download manager. Nothing is held in JavaScript memory, so a large deliverable
streams straight through.
Use it
- Install the bundle into a profile (see Install below).
- Open a Session in the Web GUI and refresh the page.
- The Session header shows a Download deliverables button with a count badge. Open it to see the declared files with their sizes and descriptions.
- Press Download on one file, or Download all as ZIP when several files are available.
Files appear in the panel only when the Agent declares them with present; a
Session that never declared a file shows an empty state with that hint.
Install
# from npm
dsh plugin --profile web add dsh-file-download
# or from a local checkout
dsh plugin --profile web add /path/to/dsh-file-download
The package carries no runtime dependency beyond Node built-ins, so the bundle installs without a build step or a network fetch.
Routes
Three authenticated routes are claimed on Connection's /api fence, so they
inherit browser-cookie authentication plus Host/Origin trust. A fourth route is
an unauthenticated operational probe.
| Route | Purpose |
|---|---|
GET /api/dsh-file-download.list?sessionId=<id> | JSON listing: declared path, name, size, description, and a missing flag |
GET|HEAD /api/dsh-file-download.file?sessionId=<id>&seq=<n>&index=<m> | One declared file as an attachment |
GET|HEAD /api/dsh-file-download.bundle?sessionId=<id> | Every available declared file as one ZIP |
GET /dsh-file-download/health | { ok: true, plugin, version } for deployment probes (no Session data) |
Safety properties
- Coordinates, not paths. The browser never sends a filesystem path. It
sends a
presentevent coordinate (seq+index); the Host re-reads the Session log, recovers the declared path, resolves it through the composed filesystem, and only then opens it. An arbitrary path cannot be requested. - No host paths in responses. Listings expose only the declared path, name, size, and description.
- Downloads are attachments.
Content-Dispositionuses an ASCII fallback plus RFC 5987filename*, so non-ASCII names survive every browser. Responses are sent withx-content-type-options: nosniff. - No
Content-Lengthon single files. A delivered file may change between the stat and the stream; a stale length would hang the browser, so the response is chunked instead. - Archive entry names are sanitized. Traversal segments, absolute roots, and control characters are removed, and duplicate names get a numeric suffix.
- Zero dependencies. The ZIP writer is built on
node:zlibalone, so the plugin loads in deployments whose profile does not ship an archiver.
Limits
- The listing is derived from
presentdeclarations in the Session log; files the Agent wrote but never declared are not listed. - A single file at or above 4 GiB, an archive at or above 4 GiB, or more than 65535 entries fails loudly: this writer implements no Zip64.
- Downloaded content is streamed as the Agent left it; the plugin neither transforms nor re-encodes files.
Layout
| Path | Role |
|---|---|
lib/index.js | Host half: route registration, Session-log reading, file streaming |
lib/zip.js | Dependency-free streaming ZIP writer |
lib/client.js | Browser half: header control, listing panel, download handoff |
cordis.patch.yml | Bundle patch inserting the plugin row into the profile |
test/host.test.mjs | Behavior specs (routes, headers, archive validity) |
PUBLISHING.md | Release checklist and community submission guide |
CHANGELOG.md | Release history |
evidence/ | Verification report and raw logs for this build |
.github/workflows/test.yml | CI: syntax check, specs, packaging smoke test |
License
MIT
Comments
Loading…
From the same category
by tt-a1i
Agent skill for beautiful, verifiable architecture, workflow, sequence, data-flow, and lifecycle diagrams—self-contained HTML with motion and crisp export.
★ 73.9k
↓ 4.8k/wk
MIT
JavaScript
Sep 29, 2026
dsh plugin --profile agent add @tt-a1i/archify-dshDeepSeek Harness plugin for Reactive Resume: bridges your resumes and job applications into a Harness session over MCP.
★ 41.7k
↓ 275/wk
MIT
Aug 24, 2026
dsh plugin --profile web add dsh-plugin-reactive-resumeby Tencent
Open-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki.
★ 31.2k
↓ 1k/wk
NOASSERTION
Go
Sep 29, 2026
dsh plugin --profile web add @wxg-prc-cpg/dsh-weknoraby anywhere-labs
为 DeepSeek Harness (DSH) 插件生态打造的现代化桌面端解决方案。万物皆「插件」,桌面本身也是「插件」。
★ 29.5k
↓ 192/wk
MIT
TypeScript
Sep 29, 2026
dsh plugin --profile web add dsh-plugin-desktopdeepseek-harness-desktop is a interface plugin for DeepSeek Harness. See the repository documentation for its documented capabilities.
★ 28.6k
MIT
by titanwings
Distilly — Distill how they think into reusable Skills for any Agent or Bot. Formerly Colleague Skill(原同事 Skill).
★ 25.1k
MIT
TypeScript
Sep 22, 2026