Plugin pack for DeepSeek Harness.
Everything ships as standard dsh bundles. The plugins are plain JavaScript, and the launchers run on Windows, macOS and Linux β the Windows half is PowerShell, the macOS/Linux half is plain POSIX shell.
run-desktop.bat: the shell's splash while npx works, and the same window once the harness is listening.
Each package's own README is the reference for what it does, why it is built that way and what it touches; the table below is the map.
| Package | What it does | Status |
|---|---|---|
dsh-vn-master |
README.md |
alpha 0.1.0-alpha.1 |
dsh-rightbar |
README.md |
alpha 0.1.0-alpha.2 |
dsh-rightbar-files |
README.md |
alpha 0.1.0-alpha.1 |
dsh-editor |
README.md |
alpha 0.1.0-alpha.9 |
dsh-gittree |
README.md |
alpha 0.1.0-alpha.4 |
dsh-image |
README.md |
alpha 0.1.0-alpha.1 |
dsh-audio |
README.md |
alpha 0.1.0-alpha.1 |
dsh-diagrams |
README.md |
alpha 0.1.0-alpha.6 |
dsh-pdf |
README.md |
alpha 0.1.0-alpha.3 |
dsh-terminal |
README.md |
alpha 0.1.0-alpha.3 |
dsh-themes |
README.md |
alpha 0.1.0-alpha.13 |
dsh-modal |
README.md |
alpha 0.1.0-alpha.1 |
dsh-open-in-app |
README.md |
alpha 0.1.0-alpha.1 |
The pack used to ship its own Files panel (
dsh-files, earlierdsh-focus) with a private dock and header capsules; that was retired when the harness grew a real right Sidebar. Now the pack goes one step further and owns the bar itself by forking it β seepackages/dsh-rightbar/README.mdand thescripts/sync-vendored.ps1re-sync path. The same fork-and-disable scheme owns the file-manager half of Open Inβ¦ (dsh-open-in-app).The pack's master is a bundle of its own,
dsh-vn-master, and it is deliberately blank: the bundle layer plus one no-op row, with no browser half, no service and no inject edge. So the right bar keeps only bar responsibilities, and the master β installed last β is where pack-wide patches go.
Three commands take you from a fresh clone to a running app. Everything else in this repository is documentation.
What you need: Node.js 22 or newer, with npm/npx. That is the whole
requirement. Chrome is optional β the launcher falls back to your default
browser. Three features have optional extras: the History tab needs git on
PATH, TikZ diagrams need a TeX engine (pdflatex, xelatex or lualatex),
and PDF page pictures (pdf_render) need a rasterizer (pdftoppm from
poppler, mutool, or Ghostscript). Without them, the rest of the pack works
unchanged β reading and searching a PDF needs nothing at all, because the pdf.js
engine is vendored inside dsh-pdf.
Windows uses the .bat files, macOS/Linux the .sh ones β and the Unix
side never needs PowerShell.
| Step | Windows | macOS / Linux | What it does |
|---|---|---|---|
| 1. Install | install.bat |
./install.sh |
adds every bundle under packages/ to the web profile (~/.dsh/profiles/web) and copies the bundled skills into ~/.dsh/skills |
| 2. Run | run.bat (double-click) |
./run.sh |
starts npx @deepseek-ai/dsh@<pin> web and opens the URL it prints β token included β in Chrome, falling back to the default browser |
| 2b. Run (desktop) | run-desktop.bat (double-click) |
cargo build --release in app/src-tauri |
the same harness in a native window instead of a browser tab: builds the small Rust/Tauri shell under app/ when it is out of date, then starts the same pinned server on the harness's own default port when it is free (a free one otherwise) and shows it in a WebView2 / WKWebView / WebKitGTK window |
| 3. Remove | uninstall.bat |
./uninstall.sh |
removes the bundles, their patch layers and the skills the installer copied |
:: Windows - install/uninstall/run are all double-click friendly
install.bat :: installs into the web profile (the only target)
run.bat :: starts the harness and opens it in Chrome
:: (the entry point; scripts\run-web.ps1 does the work)
run-desktop.bat :: the same harness in a NATIVE WINDOW instead of a
:: browser tab (cargo builds app\src-tauri first)
uninstall.bat :: removes the pack# macOS / Linux - from the repo root
./install.sh # the web profile (the only target)
./run.sh # start the harness and open it in Chrome
./uninstall.sh # remove the packThe run launcher keeps the harness in the foreground of that terminal, so the
app's own output β including the dsh web: http://127.0.0.1:3080/?token=β¦
line β stays visible and Ctrl+C stops it. Flags pass straight through:
-Port 3099when port 3080 is already taken,-DefaultBrowserto skip Chrome,-NoBrowserto start the server without opening a browser at all.
The URL is opened only when it names a loopback address, and the launch token is never written to a file β both rules are explained in SECURITY.md.
Prefer a window to a tab? run-desktop.bat builds and runs the small
Rust/Tauri shell in app/ and shows the harness in a native
WebView2 / WKWebView / WebKitGTK window. It is the same server, the same pin and
the same profile β nothing is bundled and no plugin knows the difference, so the
two launchers are interchangeable. The shell asks for the harness's own default
port when nothing holds it β the same origin a run.bat tab opens on, which is
what keeps the window's per-origin client state β and falls back to a free
loopback port when something already has it, so it never collides with a run.bat
server or the Web GUI. It opens its window immediately with a
splash while npx works, holds the launch token to the same two rules the
browser launcher does, and kills the harness when the window closes. It needs the
Rust toolchain (rustup.rs) in addition to Node.js; the first
build compiles the shell's dependencies and takes a few minutes, after which it
is instant. The same shell compiles on macOS and Linux with
cargo build --release in app/src-tauri; only the Windows double-click wrapper
is committed so far.
Install flags: -Force re-adds bundles even when the versions match.
-Plugin / -DshHome / -ProfileName / -DshVersion / -Target web|cli
behave as documented in docs/INSTALL.md, which also has the
no-script path:
:: Windows (direct)
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/install-all.ps1 -Force# macOS / Linux (direct)
sh scripts/install-all.sh -ForceBoth installer halves do the same work, and re-running them is safe:
- pin the dsh version from
.dsh-version.jsonand run everything throughnpx @deepseek-ai/dsh@<pinned>, - reuse a system pnpm when it is new enough for the profile, else bootstrap a
private copy under
./tools(no admin rights, nothing global), - resolve the web profile (
$DSH_HOME/profiles/web,$DSH_HOME= env var or~/.dsh), - prune retired bundle names (
dsh-focus,dsh-filesβ the pack's own Files panel, now shipped by the harness itself) so an upgrade cannot double-mount, - run
dsh plugin --profile web add <bundle>for every package underpackages/(bundles already at the repo version are skipped unless-Force), - copy the skills a bundle ships (
packages/<bundle>/skills/<name>/SKILL.md) into$DSH_HOME/skills, where the harness' own filesystem skill provider reads them. Every folder the installer creates carries a marker file, so a person's own skill of the same name is never overwritten and uninstall only removes what it wrote, - print next steps. Neither half touches API keys β add yours in Settings β Models.
To remove the pack, run uninstall.bat (Windows) or ./uninstall.sh
(macOS/Linux); both take the same -Plugin / -DshHome / -ProfileName
switches. Removing a bundle also removes its patch layer.
- Alpha software, on purpose. Every package ships as
-alpha.N, and the pack is built and tested against the one harness line pinned in.dsh-version.json(0.1.5-rc.1) β never againstlatest.dsh-rightbar,dsh-rightbar-filesanddsh-open-in-appare forks of that line's client bundles, so a pin bump is a deliberate step: bump the pin, runscripts/sync-vendored.ps1to move the forks forward, then re-verify (seepackages/dsh-rightbar/README.md).dsh-open-in-appis the one fork that is not byte-for-byte β its documented patches live insync-vendored.ps1.sync-vendored.ps1is maintainer tooling, and the one script in this repo that wants PowerShell 7 (pwsh) on macOS/Linux; the installers never do. - Plain JavaScript, no build step. The UI halves are hand-written
module-table bundles, so the edit β restart loop stays instant. A few files
are generated and never hand-edited: the three forked bundles
(
dsh-rightbar/lib/client.js,dsh-rightbar-files/lib/client.js,dsh-open-in-app/lib/client.js) and the engines the pack vendors and serves itself βdsh-editor's CodeMirror 6,dsh-diagrams' Mermaid (rebuilt bypackages/dsh-diagrams/vendor/build.mjs),dsh-pdf's pdf.js (engine, worker, cMaps and standard fonts, rebuilt bypackages/dsh-pdf/vendor/build.mjs) anddsh-terminal's xterm.js with its stylesheet. - Making a change visible. After editing a
client.js, restartnpx @deepseek-ai/dsh weband hard-refresh the browser (Ctrl+F5). The web profile installs every bundle as a live link into this repo, so the edit is already "installed" β but the bundle is read once, at app boot. A plaininstall.bat/./install.shre-syncs every bundle whose version in this repo changed (bumppackage.json+.dsh-version.jsonfirst);-Forcere-adds regardless, which is what a changed package set needs. There is no hot reload unless apnpm run dev:webwatcher from the harness repo is running. - Running it.
run.bat/./run.shstart the pinneddsh webwith--no-open, read thedsh web: http://127.0.0.1:<port>/?token=<token>line the app prints once it is listening, and open that URL in Chrome (the default browser is the fallback). A URL that does not name a loopback address is refused instead of opened, and the launch token β a live credential for the running process β is only ever held in memory: never written to a file, never passed through a shell. On Windowsrun.batis the double-clickable entry point andscripts/run-web.ps1the worker behind it, because cmd cannot watch a running child's output; SECURITY.md describes the whole access model and how to lock the app down. Running it in a window instead:run-desktop.batdoes the same job with a webview in place of the browser hand-off β the watching half is Rust (app/), so it is one batch file with no PowerShell worker, and it holds the launch token to the same rules. - Where to read more.
docs/INSTALL.mdhas the manual install path and troubleshooting,docs/COMPATIBILITY.mdthe supported harness line, and each package's own README the details of that plugin βARCHITECTURE.mdhas a section per plugin, including Β§16 the PDF plugin.
- MIT β see LICENSE. Plugins are authored by vecnode.
- Security policy (supported line, private reporting, hardening expectations): SECURITY.md. This pack never touches API keys and never patches DeepSeek core files: it adds its own rows and (for the right bar) disables the shipped rows, then supplies its own copied bundles.
AGENTS.md quick-start brief for coding agents working in this repo
ARCHITECTURE.md deep dive: plugin model, the right bar fork, the editor tab, installer
LICENSE MIT license (vecnode)
SECURITY.md security policy: supported line, private reporting, hardening
.gitattributes keeps the .sh launchers LF (a CRLF shebang breaks them)
packages/dsh-vn-master/ the one bundle with NO client half - the blank master layer
packages/<bundle>/ one standalone dsh bundle (package.json + cordis.patch.yml + lib/)
lib/index.js Node half (may be a no-op row so the client bundle ships)
lib/client.js Browser half (module-table bundle; hand-written or GENERATED fork)
scripts/ install-all.ps1 / uninstall-all.ps1 (Windows PowerShell)
and install-all.sh / uninstall-all.sh (POSIX sh for
macOS/Linux), plus sync-vendored.ps1 (maintainer fork
re-sync) and the .bat / .sh console twins
checks/ standalone verification for the JS halves (see its README)
.dsh-version.json the pinned harness line + per-package versions
install.bat / .sh installer | uninstall.bat / .sh remover
run.bat / run.sh starts the app and opens it in a browser
run-desktop.bat the same app in a native window (builds + runs app/)
app/ the Rust/Tauri desktop shell: src-tauri/ (the supervisor)
+ ui/ (its splash). NOT a plugin and NOT installed into
any profile - a launcher for the web profile
scripts/make-desktop-icon.mjs regenerates app/src-tauri/icons from
assets/vn-harness.svg (the icons are committed)
