dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
English | 中文
Download the files an Agent delivers, straight from the DSH Web GUI.
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.
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.
# 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.
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) |
present event 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.Content-Disposition uses an ASCII fallback
plus RFC 5987 filename*, so non-ASCII names survive every browser. Responses
are sent with x-content-type-options: nosniff.Content-Length on 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.node:zlib alone, so the
plugin loads in deployments whose profile does not ship an archiver.present declarations in the Session log; files
the Agent wrote but never declared are not listed.| 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 |
MIT